【问题标题】:Durandal TodoMVC - Cannot write a value to a ko.computedDurandal TodoMVC - 无法将值写入 ko.computed
【发布时间】:2013-05-14 18:56:14
【问题描述】:

我正在尝试使用来自TodoMVC templateDurandal(包括Knockout + RequireJS)构建待办事项应用程序的一个版本。我意识到待办事项应用程序并没有真正展示 Durandal 的功能,但我正在学习,并认为这将是一个很好的第一个项目。

无论如何,在此过程中,我偶然发现了一个我无法解决的错误(见下文)。

Error("Cannot write a value to a ko.computed unless you specify a 'write' option. If you wish to read the current value, don't pass any parameters.")

我还附上了一张在控制台中显示这些内容的图片。

您可以在https://github.com/robksawyer/durandal-todo 找到源代码。待办事项视图模型位于https://github.com/robksawyer/durandal-todo/blob/master/viewmodels/todos.js

更新:大部分 Knockout 代码是从 https://github.com/tastejs/todomvc/tree/gh-pages/labs/dependency-examples/knockoutjs_require/ 的 Knockout+Require TodoMVC 项目借用的

感谢您的宝贵时间。

【问题讨论】:

  • 您是否尝试过错误消息中的建议?
  • 我应该提醒一下,我项目中的 Knockout 代码是从现有的 TodoMVC 版本 (github.com/tastejs/todomvc/tree/gh-pages/labs/…) 借来的。这个版本使用了 Knockout + Require,所以代码理论上应该和我应该使用的代码相似,对吧?因此,我没有更新 ko.computeds 的任何代码。

标签: javascript design-patterns module durandal todomvc


【解决方案1】:

我认为您误读了控制台。

例如,“allCompleted”是您的视图模型上的一个属性,它被声明为依赖的可观察对象(即“计算”):

// writeable computed observable to handle marking all complete/incomplete
self.allCompleted = ko.computed({
    // -- trimmed --
});

您在控制台中看到的不是Cannot write a value 错误;而是它是 computed 属性的调试输出 - 即它的函数定义。作为参考,这是直接来自 knockout (2.2.1) source 的依赖可观察对象的函数定义:

function dependentObservable() {
    if (arguments.length > 0) {
        if (typeof writeFunction === "function") {
            // Writing a value
            writeFunction.apply(evaluatorFunctionTarget, arguments);
        } else {
            throw new Error("Cannot write a value to a ko.computed unless you specify a 'write' option. If you wish to read the current value, don't pass any parameters.");
        }
        return this; // Permits chained assignments
    } else {
        // Reading the value
        if (!_hasBeenEvaluated)
            evaluateImmediate();
        ko.dependencyDetection.registerDependency(dependentObservable);
        return _latestValue;
    }
}

您在控制台中看到的是此代码的缩小版本。

如果您想查看属性返回的 ,您必须调用它。

【讨论】:

  • 好吧,让我们忘记我什至提到它。 ;) 感谢您的详细回复。
猜你喜欢
  • 2014-07-26
  • 2013-10-10
  • 1970-01-01
  • 1970-01-01
  • 2017-03-28
  • 1970-01-01
  • 1970-01-01
  • 2015-10-08
  • 1970-01-01
相关资源
最近更新 更多