2

ビューモデルに次のフィルターを追加しました。

contactsViewModel.filterItems = ko.computed(function () {
                var filter = this.filterInput().toLowerCase();
                if (!filter || !this.hasEnoughChars()) {
                    // Simply keep the results if input is empty or less 3 chars are in it
                    return this.contacts();
                } else {
                    // iterate through the JSON again
                    return ko.utils.arrayFilter(this.contacts(), function (item) {                        
                        // Return the objects that contain the filter term
                        // ko.utils.stringContains is not part of knockout
                        // Manually added to knockout-2.2.0.debug.js line 238
                        return ko.utils.stringContains(item.firstName().toLowerCase(), filter)
                            || ko.utils.stringContains(item.lastName().toLowerCase(), filter)
                            || ko.utils.stringContains(item.email().toLowerCase(), filter)
                            || ko.utils.stringContains(item.company().toLowerCase(), filter);                        
                    });
                }
            }, contactsViewModel);

stringContains を呼び出す回数を減らして、このコードを改善するにはどうすればよいですか? 私は書くことができるようにしたいと思います:

return ko.utils.stringContains(item.FirstName().toLowerCase() || item.lastName().toLowerCase() || item.email().toLowerCase() || item.company().toLowerCase(), filter);

しかし、これを行うとstringContainsは正しい値を返しません

ノックアウト より:

stringContains: function (string, contains) {
            string = string || "";
            return string.indexOf(contains) != -1;
        }

あなたの助けは大歓迎です

4

1 に答える 1

5

ko.utils.arrayFilter の使用:

return ko.utils.arrayFilter([item.FirstName().toLowerCase(), item.lastName().toLowerCase(), item.email().toLowerCase(), item.company().toLowerCase()], function (str) { return str.indexOf(filter) != -1  }).length > 0;
于 2012-11-05T13:02:01.143 に答える