我尝试使用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.")
我还附上了一张在控制台中显示这些内容的图片。
您可以在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项目借来的感谢您的时间。
答案 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;
}
}
您在控制台中看到的是此代码的缩小版本。
如果您想查看属性返回的值,则必须调用它。