2012-11-05 3 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;