Knockout计算数组不更新

Ven*_*kat 4 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);
Run Code Online (Sandbox Code Playgroud)

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

nem*_*esv 10

您在评论中提到过您使用以下代码将项目添加到您LocationCollection的问题中:

self.LocationCollection().push(item);
Run Code Online (Sandbox Code Playgroud)

哪里

self.LocationCollection = ko.observableArray();
Run Code Online (Sandbox Code Playgroud)

为了使淘汰赛的变动追踪你需要调用pushobservableArray直接(如无括号()),如文档中描述:

self.LocationCollection.push(item);
Run Code Online (Sandbox Code Playgroud)

但有什么区别?

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

此时,当您调用时,LocationCollection().push(item)您将调用push底层数组,因此knockout将无法知道它并且它不会触发您的计算可观察量.

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

样品小提琴.