假設你有以下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