2012-09-18 87 views
0

我有一個計算陣列這樣,已計算數組排序

self.weapons = ko.observableArray(
    [] 
); 

self.wings = ko.observableArray(
    [] 
); 


self.itemList = ko.computed(function() 
{ 
    return self.weapons().concat(self.wings()); 
} 
}, 
this); 

我想排序此數組。

我可以排序ko.observableArray沒有問題。

問題在這裏是我認爲,ko.computed是排序完成後再次計算回來。

另外:有沒有更好的方法連接多個observableArrays在一起?

謝謝。

回答

2

只需對連接數組進行排序。

self.itemList = ko.computed(function() { 
    var weapons = self.weapons(), 
     wings = self.wings(); 
    return weapons.concat(wings).sort(); 
}); 

每當任何一個數組發生變化時都必須使用這個函數,但對此您可以做的不多。

如果您要繼續進行很多更改,請考慮在計算出的可觀察值上使用rateLimit擴展器(或在淘汰賽3.1.x之前使用throttle)。這將通過摺疊在特定時間段內發出的所有通知來限制observable發送通知的次數。

self.itemList = ko.computed(function() { 
    ... 
}).extend({ rateLimit: 500 }); // wait at least 500ms before first notification 
+0

謝謝。這個作品當然是 ,但它非常慢。實際上添加100個項目意味着100^2 * log100。 理想情況下,連接會很淺,只有在列表完成時才需要排序。 忘記淺層合併,是否有可能僅當我想要它時對這個數組進行排序。比如添加了100個元素,而不是每次推動。 – mikbal

+0

您會快速連續修改陣列還是會長時間更改?你是否願意讓它排序(這樣你可以快速添加很多,但是會在停頓一段時間後排序)還是你想按需求排序?我相信這是可以寫出來的,我只需要知道你的目標是什麼。 –

+0

只是想要抑制排序時,我連續添加多個項目。 – mikbal