2012-11-15 108 views
1

試圖篩選具有多個條件的計算。我已經看到很多例子,其中return語句嵌套多個條件,但我真的不明白他們爲什麼工作。我的例子可能不是嵌套返回語句的候選人,但我不知道如何執行此操作。Knockout.js - 篩選具有多個條件的計算

//ko.utils.arrayFilter - filter the items using the filter text 
viewModel.filteredItems = ko.computed(function() { 
    var filter = this.filter().toLowerCase(); 
    if (!filter) { 
     return this.items(); 
    } else { 
     return ko.utils.arrayFilter(this.items(), function(item) { 
      return (item.fullName().toLowerCase().indexOf(filter) > -1); 
     }); 
    } 

    //*** THIS LOGIC WORKS BY ITSELF BUT NOT COMBINED WITH THE ABOVE LOGIC *** 
    //var t = this.selectedTag(); 
    //if (t == "all") return this.items(); 
    //return ko.utils.arrayFilter(this.items(), function(item) { 
    // return item.tag == t; 
    //}); 

}, viewModel); 

這裏是小提琴的完整的例子:http://jsfiddle.net/boyus/qTb5Q/12/

在此先感謝。

回答

1

我認爲你計算機中的邏輯稍微不正確,你沒有在數據綁定中正確設置選定的標籤。

查看http://jsfiddle.net/qTb5Q/14/獲取工作解決方案。

這裏是改變計算功能:

viewModel.filteredItems = ko.computed(function() { 
     var filter = this.filter().toLowerCase(); 
     if (!filter) { 
     var t = this.selectedTag().toLowerCase(); 
     if (!t || t == "all") return this.items(); 
     return ko.utils.arrayFilter(this.items(), function(item) { 
      return item.tag().toLowerCase() == t; 
     }); 
     } else { 
      return ko.utils.arrayFilter(this.items(), function(item) { 
       return (item.fullName().toLowerCase().indexOf(filter) > -1); 
      }); 
     } 
    }, viewModel); 
+0

這部分工作,但不能讓二次搜索,如果沒有在主搜索的輸入框的值進行任何東西。儘管這非常接近。我嘗試更改第一個可觀察對象,並嘗試使用一些簡單的jQuery代碼更改輸入框,當其中一個標記被選中但未取得成功時。 – JBoyus

+0

啊,我明白你現在想要達到的目標。這裏是一個修改後的解決方案,它可以實現你想要的功能:http://jsfiddle.net/qTb5Q/18/ –

+0

這更接近。我真的希望他們成爲互相排斥的選項,但我想我可以從這裏弄清楚。謝謝。 – JBoyus