2016-03-15 104 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