如何使用knockoutjs实现有效的过滤器

时间:2015-02-23 09:41:15

标签: javascript knockout.js

我有一个项目列表(约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>

每当其中一个过滤器更改时,将重新计算整个filteredItems。因此,当用户设置filter1然后设置filter2时,filter1将应用于100个项目。然后,再次对100个项目应用filter1和filter2。 我想知道是否有更有效的方法来应用过滤器?即重复使用先前过滤的结果?

2 个答案:

答案 0 :(得分:0)

KO只知道你在计算值中使用了多个Observable值,但它不知道原因。我认为您无法指定将代码的特定部分应用于可观察的更改事件。

我认为这样做的唯一方法(但我认为这很难看)是将您的值存储到私有变量(不可观察,juste标准JS Var)。调用computed时,将新变量与最新变量进行比较。如果有不同,则应用过滤器并将新值存储在私有变量上。

答案 1 :(得分:0)

您可能想要使用Knockout Projections

它提供了有效的地图和过滤功能:

  

这个库的关键点是这些转换是有效完成的。具体来说,执行映射的回调函数仅在严格必要时调用(通常,仅用于新添加的项)。向源数据添加新项目时,我们无需重新映射现有项目。重新排序源数据时,输出顺序会相应更改,而不会重新映射任何内容。

     

如果只是平方数字,效率可能无关紧要,   但是当您映射自定义对象的复杂嵌套图时,它   使用最小值来执行每个映射更新非常重要   工作