2

我正在尝试使用来自TodoMVC 模板的Durandal(包括Knockout + RequireJS)构建 todo 应用程序的一个版本。我意识到待办事项应用程序并没有真正展示 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.")

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

ko.计算错误

您可以在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 项目借用的

谢谢你的时间。

4

1 回答 1

4

我认为您误读了控制台。

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

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

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

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;
    }
}

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

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

于 2013-05-15T06:16:54.003 回答