我正在尝试使用我的init数组并使用自定义函数(http://knockoutjs.com/documentation/fn.html)过滤它,但不是创建一个新数组我只是覆盖了旧的。我点击了PO。在内存中它正在工作,但一旦完成它就不会绑定到DOM。这是因为我正在重写数组而不是从现有数组中删除项目吗?
答案 0 :(得分:2)
这不起作用,因为绑定将在此行中断:
self.materialTrans = self.materialTrans.filterByProperty("PO", item.PO);
Knockout observables不能被覆盖。如果要更新其值,则需要将新值作为参数传递。绑定是旧函数,您可以通过重新分配来删除它。使这项工作的一种方法是这样做:
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。如果我误解了你的目标,请告诉我。
答案 1 :(得分:0)
我不知道这是否是唯一的问题,但要设置observableArray的值,请执行以下操作:
self.materialTrans(x);
而不是:
self.materialTrans = x;
当然,x是新过滤的数组。