2016-03-15 147 views
0

我試圖通過標籤網格篩選項目,在網格中的數據看起來像這樣劍道的UI電網濾波

[ 
    { id: 0, tags: [{ text: 'boat' }, { text: 'summer' }] }, 
    { id: 1, tags: [{ text: 'boat' }] }, 
    { id: 2, tags: [{ text: 'travel' }] }, 
    { id: 3, tags: [{ text: 'boat' }] }, 
    { id: 4, tags: [{ text: 'travel' }] }, 
    { id: 5, tags: [{ text: 'travel' }, { text: 'summer' }] } 
] 

和過濾功能看起來像這樣

$scope.filterGrid = function (e) { 
     var grid = $('#imageGrid').data('kendoGrid'); 
     var val = [{ text: 'travel' }, { text: 'summer' }]; 
     grid.dataSource.filter({}); 

     if ($.trim(val) !== '') { 
      grid.dataSource.filter({ 
       logic: 'or', 
       filters: [{ 
        field: 'tags', 
        operator: function (item) { 
         var status = false; 
         for (var n = 0, length2 = val.length; n < length2; n++) { 
          for (var i = 0, length = item.length; i < length; i++) { 
           if (item[i].text.indexOf(val[n].text) !== -1) { 
            status = true; 
            break; 
           } 
          } 
         } 
         return status; 
        } 
       }] 
      }); 
     } 

    }; 

在這個例子中,val = travel,夏天我只想顯示兩個標籤(id 5)的項目,但它顯示包含任一標籤的所有項目(id:0,2,4,5)

什麼我做錯了,有沒有更好的辦法用劍道做這個?

回答

0

你濾波算法是接受item有兩個期望的值的至少一個,因爲迴路斷線時,在這裏找到一個:

if (item[i].text.indexOf(val[n].text) !== -1) { 
    status = true; 
    break; 
} 

我已經改變了一點你的代碼是:

operator: function (item) { 
    var found = 0; 

    for (var i = 0, length = item.length; i < length; i++) { 
     for (var n = 0, length2 = val.length; n < length2; n++) { 
      if (item[i].text.indexOf(val[n].text) !== -1) { 
       found++; 
       break; 
      } 
     } 
    } 

    return found == val.length; 
} 

它計算總髮現標籤(found)並返回true只有找到的項目數是相同的搜索項(val.length)。所以它開始迭代通過item,而不是通過val,因爲規則代表該項目必須是所有值,而不是周圍。因此,對於每個item執行檢查,如果它具有所有val項目和總計found計數器。最後,如果found等於val.length這意味着val上的所有項都在item之內。

Working demo