我正在尝试使用Durandal构建todo应用程序的一个版本(包括 Knockout + RequireJS )来自 TodoMVC template 。我意识到待办事项应用程序并没有真正展示 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 View 模型位于 https://github.com/robksawyer/durandal-todo/blob/master/viewmodels/todos.js 。
更新:大部分 Knockout 代码借用自 Knockout+Require TodoMVC 项目 https://github.com/tastejs/todomvc/tree/gh-pages/labs/dependency-examples/knockoutjs_require/
感谢您的宝贵时间。
最佳答案
我认为您误读了控制台。
例如,“allCompleted”是 View 模型上的一个属性,它被声明为依赖的可观察量(即“计算的”):
// writeable computed observable to handle marking all complete/incomplete
self.allCompleted = ko.computed({
// -- trimmed --
});
您在控制台中看到的不是无法写入值
错误;而是它是计算属性的调试输出 - 即它的函数定义。作为引用,这里是直接来自 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;
}
}
您在控制台中看到的是此代码的缩小版本。
如果您想查看属性返回的值,您必须调用它。
关于javascript - Durandal TodoMVC - 无法将值写入 ko.compulated,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16550727/