我有一個項目列表(約100項),它們顯示在列表中。 還有一個規定可以應用幾個過濾器。 我正在使用knockoutJS進行數據綁定。當前的實現是像這樣:如何使用knockoutjs實現高效過濾器
var vmModel = function() {
var self = this;
self.items = ko.observableArray([])
self.filter1 = ko.observable()
self.filter2 = ko.observable()
self.filter3 = ko.observable()
self.filteredItems = ko.computed(function(){
var allItems = self.items()
if (self.filter1()) {
allItems = ko.utils.arrayFilter(allitems,
function(item) {return "some condition";})}
...
Other filters
...
}) // end of computed function
})// end of vmModel
在我的HTML
<ul data-bind="foreach: filteredItems">
<li data-bind="text: some data"></li>
</ul>
每當過濾器的一個改變整個filteredItems被重新計算。因此,當用戶設置filter1,然後設置filter2時,filter1將應用於100個項目。然後,再次爲100個項目應用filter1和filter2。 我想知道是否有更有效的方法來應用過濾器?即重新使用以前的過濾結果?
似乎你低估了現代設備的計算能力。唯一能讓事情變得更流暢的真正功能 - 'rateLimit'你的'computed'(http://knockoutjs.com/documentation/rateLimit-observable.html) – 2015-02-23 09:58:37
而不是每個過濾器都使用'ko.utils.arrayFilter'你最好有一個for循環,然後根據你的過濾器篩選每個項目。這意味着如果應用了多個過濾器,那麼在所有項目中仍然只有一個循環。正如f_martinez所說,rateLimiting也可以使用,但這意味着過濾器不會立即應用,這可能是您不想要的。 – 2015-02-23 10:43:34
@WayneEllery我想我正在做同樣的事情。 問題在於,當您應用第二個過濾器時,會調用相同的循環,然後將filter1和filter2應用於vanila列表項。 – pravin 2015-02-23 17:29:29