2012-12-01 77 views
4

我面臨的一個問題是,計算的可觀察數組在更新新項目時未更新。敲除計算數組不更新

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()添加項目不更新所計算的陣列。

+4

看來你的代碼工作得很好:http://jsfiddle.net/nemesv/egFSh/它添加項目'LocationCollection'時更新'FilteredCityList'。你可以把一個示例jsfiddle放在一起來展示你的問題嗎? – nemesv

+0

謝謝老兄。它的工作現在。我已經使用self.LocationCollection()。push(item)添加了一個項目。現在看到你的後,我改爲self.LocationCollection.push(item)。你能讓我知道我的最新錯誤嗎? – Venkat

回答

9

你已經在你的意見,你已經使用了下面的代碼項目添加到您的LocationCollection造成你的問題中提到:

self.LocationCollection().push(item); 

self.LocationCollection = ko.observableArray(); 

爲了使淘汰賽的變動追蹤您需要直接在observableArray上撥打push(例如,不帶括號()as described in the documentation

self.LocationCollection.push(item); 

但有什麼區別?

ko.observableArray()調用將返回一個函數。要獲得底層數組,你需要調用這個函數(例如self.LocationCollection()),它返回存儲的數組。

在這個時候,當你打電話給LocationCollection().push(item)你會在底層數組上調用push,所以淘汰賽不會知道它,它不會觸發你的計算觀察值。

這就是爲什麼在淘汰賽,他們在observableArray定義自己push方法本身需要什麼樣的語法LocationCollection.push(item)打電話,因爲它的基因敲除的方法將正確地跟蹤變化。

Sample fiddle.

+0

哦,哇,我完全錯過了這個文檔!非常感謝! – theoutlander

+0

+1 - 您在幫助識別真實問題的方式上的榮譽,這在他的初始描述中並未直接顯現。 –