2012-11-05 155 views
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; 
     } 

你的帮助是多少赞赏

回答

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;