2012-09-18 86 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