【发布时间】:2015-04-24 14:17:55
【问题描述】:
我有一个项目列表(大约 100 个项目),它们显示在一个列表中。 还有一项规定可以应用几个过滤器。 我正在使用 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>
只要其中一个过滤器发生变化,就会重新计算整个过滤项。因此,当用户设置 filter1 然后 filter2 时,filter1 应用于 100 个项目。然后,再次将 filter1 和 filter2 应用于 100 个项目。 我想知道是否有更有效的方法来应用过滤器?即重复使用以前过滤的结果?
【问题讨论】:
-
看来您低估了现代设备的计算能力。唯一可以让事情变得更顺畅的真正功能 -
rateLimit-ing 你的computed(knockoutjs.com/documentation/rateLimit-observable.html) -
不要为每个过滤器使用
ko.utils.arrayFilter,最好使用一个for循环,然后根据您的过滤器过滤每个项目。这意味着如果应用了多个过滤器,那么仍然只有一个循环遍历所有项目。正如 f_martinez 所说,也可以使用 rateLimiting,但这意味着过滤器不会立即应用,这可能是您不想要的。 -
@WayneEllery 我想我也在做同样的事情。问题是当您应用第二个过滤器时,会调用相同的循环,然后将 filter1 和 filter2 应用于 vanila 列表项。