Knockoutjs observableArray没有约束力

时间:2012-08-22 20:59:28

标签: knockout.js

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

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

2 个答案:

答案 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是新过滤的数组。