我想拿我的init數組並通過使用自定義函數(http://knockoutjs.com/documentation/fn.html)來過濾它,而不是創建一個新的數組,只是覆蓋舊的。我點擊採購訂單。在內存中它正在工作,但一旦完成就不會綁定到DOM。這是因爲我重寫數組而不是從現有數組中刪除項目?Knockoutjs observableArray沒有約束
http://jsfiddle.net/chadrickm/39xsC/
我想拿我的init數組並通過使用自定義函數(http://knockoutjs.com/documentation/fn.html)來過濾它,而不是創建一個新的數組,只是覆蓋舊的。我點擊採購訂單。在內存中它正在工作,但一旦完成就不會綁定到DOM。這是因爲我重寫數組而不是從現有數組中刪除項目?Knockoutjs observableArray沒有約束
http://jsfiddle.net/chadrickm/39xsC/
因爲綁定是要在這一行打破這將不起作用:
self.materialTrans = self.materialTrans.filterByProperty("PO", item.PO);
淘汰賽觀測不能被覆蓋。如果您想更新它們的值,則需要將新值作爲參數傳遞。綁定是通過重新分配它而去除的舊函數。一種方法,使這項工作是這樣做的:
self.materialTrans(self.materialTrans.filterByProperty("PO", item.PO));
,改變你的函數,只是返回一個數組:
ko.observableArray.fn.filterByProperty = function(propName, matchValue) {
var allItems = this(),
matchingItems = [];
for (var i = 0; i < allItems.length; i++) {
var current = allItems[i];
if (ko.utils.unwrapObservable(current[propName]) === matchValue) matchingItems.push(current);
}
return matchingItems;
};
這裏是更新fiddle。如果我誤解了你的目標,請告訴我。
我不知道它是否是唯一的問題,而是設置一個observableArray的值,這樣做:
self.materialTrans(x);
取而代之的是:
self.materialTrans = x;
其中x是新過濾陣列,當然。
非常感謝Tyrsius的快速反應。 – MadDogMcFie