Knockout计算数组不更新

时间:2012-12-01 18:49:18

标签: knockout.js

我遇到的问题是,在添加新项目时,计算的observable数组不会更新。

self.FilteredCityList = ko.computed(function() {
  var filteredCollection = ko.utils.arrayFilter(self.CityListCollection(), function(r) {
    var matchingItem = ko.utils.arrayFilter(self.LocationCollection(), function(r1) {
      return r1.LocationCode() == r.LocationCode();
    });
    if (matchingItem.length > 0) {
     return false;
    }
    return true;
  });
  return filteredCollection;
}, this);

当我在self.LocationCollection()中添加项目时,计算出的数组不会更新。

1 个答案:

答案 0 :(得分:10)

您在评论中提到,您已使用以下代码向LocationCollection添加导致问题的项目:

self.LocationCollection().push(item);

其中

self.LocationCollection = ko.observableArray();

要启用淘汰赛的更改跟踪,您需要直接在push上致电observableArray(例如没有括号()as described in the documentation

self.LocationCollection.push(item);

但有什么区别?

ko.observableArray()调用将返回一个函数。要获取底层数组,您需要调用此函数(例如self.LocationCollection()),该函数返回存储的数组。

此时,当您致电LocationCollection().push(item)时,您将在底层阵列上调用push,因此淘汰赛不会知道它并且它不会触发您的计算可观察量。

这就是为什么在淘汰赛中他们在push本身定义了自己的observableArray方法,你需要用语法LocationCollection.push(item)来调用它,因为它是淘汰赛的方法,它会正确地跟踪变化。

Sample fiddle.