1

我正在尝试使用我的 init 数组并使用自定义函数(如 (http://knockoutjs.com/documentation/fn.html))对其进行过滤,而不是创建一个新数组,我只是覆盖旧数组。我正在点击 PO 。在内存中它正在工作,但一旦完成它就不会绑定到 DOM。这是因为我正在重写数组而不是从现有数组中删除项目吗?

http://jsfiddle.net/chadrickm/39xsC/

4

2 回答 2

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;
};

这是更新的小提琴。如果我误解了你的目标,请告诉我。

于 2012-08-22T21:30:24.127 回答
0

我不知道这是否是唯一的问题,但是要设置 observableArray 的值,请执行以下操作:

self.materialTrans(x);

而不是这个:

self.materialTrans = x;

其中 x 是新的过滤数组,当然。

于 2012-08-22T21:34:48.477 回答