Durandal TodoMVC - 无法将值写入ko.computed

时间:2013-05-14 18:56:14

标签: javascript design-patterns module durandal todomvc

我尝试使用Durandal中的Knockout(包括RequireJS + TodoMVC template)来构建待办事项应用的版本。我意识到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.computed errors

您可以在https://github.com/robksawyer/durandal-todo找到源代码。 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项目借来的

感谢您的时间。

1 个答案:

答案 0 :(得分:4)

我认为你误读了控制台。

例如,“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;
    }
}

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

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