我遇到的问题是,在添加新项目时,计算的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()
中添加项目时,计算出的数组不会更新。
答案 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)
来调用它,因为它是淘汰赛的方法,它会正确地跟踪变化。