假设您有以下js:
var vm = {
objects: ko.observable([]),
objectCount: ko.computed(function(){
return vm && vm.objects().length;
}),
add: function() {
var current = vm.objects();
current.push({});
console.log('current is', current);
vm.objects(current);
console.log("should recalculate here", vm.objectCount());
}
};
以下html:
<ul data-bind="foreach: objects">
<li>
Object: <span data-bind="text: $index"></span>
</li>
</ul>
<button data-bind="click: add">Add Object</button>
<p>
Total number of objects:
<span data-bind="text: objectCount"></span>
</p>
这是我的理解from reading the documentation,因为在我添加一个对象之后我调用了objectCount(),它应该重新计算它的依赖关系。相反,它似乎永远不会执行该功能,只运行一次!
答案 0 :(得分:4)
在定义viewModel之后定义你的计算机 - http://jsbin.com/welcome/58760/ - 它的发生是因为计算的observable的工作方式(来自ko docs)。
在vm对象中实例化observable时,其他属性尚不存在。
答案 1 :(得分:2)
这只是一个范围问题。如果您将脚本代码重构为如下所示:
$(function(){
var vm = function(){
var self = this;
self.objects = ko.observable([]);
self.objectCount = ko.computed(function(){
return self.objects().length;
});
self.add = function() {
var current = self.objects();
current.push({});
console.log('current is', current);
self.objects(current);
console.log("should recalculate here", self.objectCount());
};
};
ko.applyBindings(new vm());
});
然后正确的变量是作用域的,Knockout正确地计算了依赖关系。正如guigouz所述,最初调用ko.computed
时,vm
未定义,因此无法设置任何更改处理程序。
答案 2 :(得分:2)
另一种方法是使用deferEvaluation
的{{1}}选项。这将告诉Knockout在第一次使用之前等待评估计算的observable。到那时,ko.computed
将被定义。
vm