假设你有以下JS:knockout.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(),它应该重新计算它的依赖关系。相反,它似乎从来没有执行该功能,只运行一次!
JSBin demonstrating a simplified version of my issue.
没错,但是第3点意味着它会重新计算,不是吗?尽管在更仔细的阅读中,它意味着价值被记录下来,并且只有在用户更新时才会更新(解释我的问题)。我想指出的是,虽然在你的例子中删除复选标记不起作用 - 因为这些也是可观察的,我不确定为什么是这种情况。 –
但是当评估者完成时,你的vm对象上没有可观察的事物(他们还没有存在,因为var语句没有完成)。 checked()不起作用,因为您使用的是value:binding,而不是checked:在复选框上,这里是更新的小提琴 - http://jsbin.com/welcome/58799/ - 我还将对象更改为observableArray,这样ko只会在你推动它们时渲染新的元素,而不是重新渲染整个数组。 我还建议将你的viewmodels定义为函数,并将它们实例化为Josh提出的,但这并不能解释为什么它不起作用。 – guigouz