2013-05-13 32 views
0

我正在slickgrid中使用数据视图模型中的搜索过滤器。它有时可以很好,但并非总是如此。slickgrid搜索有时不会更新

例如,

(1)我的网格有4行。

(2)当我搜索第一行时,其他3行被删除(这是正确的)。

(3)但是,如果我删除我的搜索文本,所有4行应理想地出现,但我的网格显示4行包含以前搜索的行两次。

我在哪里错了?

这里是我的滤镜功能代码:

function myFilter(item, args) { 

    if(item["myColumn"].toString().toLowerCase().indexOf(args.searchString.toLowerCase()) == -1){ 
     return false; 
    } else { 
     return true; 
    } 
} 

代码为电网创造:

dataView = new Slick.Data.DataView(); 
     grid = new Slick.Grid("#gridbox", dataView, columns, options); 
     grid.setSelectionModel(new Slick.RowSelectionModel()); 

     // initialize the model after all the events have been hooked up 
      dataView.beginUpdate(); 
      dataView.setItems(data); 
      dataView.setFilterArgs({ 
       searchString: searchString 
      }); 
      dataView.setFilter(myFilter); 
      dataView.endUpdate(); 
      grid.render(); 

     grid.onSort.subscribe(function(e, args) { 
      var cols = args.sortCols; 

      dataView.sort(function(dataRow1, dataRow2) { 
         for (i = 0, l = cols.length; i < l; i++) { 
          var field = cols[i].sortCol.field; 
          var sign = cols[i].sortAsc ? 1 : -1; 

          var value1 = dataRow1[field], value2 = dataRow2[field]; 

          if((field.indexOf('providerName') != -1) || (field.indexOf('serviceAddress') != -1)) 
          { 
           value1 = value1.toLowerCase(); 
           value2 = value2.toLowerCase(); 
          } 

          if(field.indexOf('providerName') != -1) 
          { 
           value1 = value1.replace(/[0-9]*/,''); 
           value2 = value2.replace(/[0-9]*/,''); 
          } 

          var result = (value1 == value2 ? 0 
            : (value1 > value2 ? 1 : -1)) 
            * sign; 
          if (result != 0) { 
           return result; 
          } 
         } 
         return 0; 
        }); 
      grid.invalidate(); 
      grid.render(); 
      bindClickOnRowCB();  
     }); 

     grid.onScroll.subscribe(function(e) { 
      grid.invalidate(); 
      grid.render(); 
      bindClickOnRowCB();  
     }); 

     // wire up model events to drive the grid 
      dataView.onRowCountChanged.subscribe(function (e, args) { 
      grid.updateRowCount(); 
      grid.render(); 
      }); 

      dataView.onRowsChanged.subscribe(function (e, args) { 
      grid.invalidateRows(args.rows); 
      grid.render(); 
      }); 

     // wire up the search textbox to apply the filter to the model 
      $("#txtSearch").keyup(function (e) { 
      Slick.GlobalEditorLock.cancelCurrentEdit(); 

      // clear on Esc 
      if (e.which == 27) { 
       this.value = ""; 
      } 
      searchString = this.value; 

      updateFilter(); 
      }); 
+0

代码在哪里? – peter 2013-05-14 07:16:40

+0

@peter - 我给出了我的Filter函数的示例算法。 – 2013-05-14 12:28:10

回答

0

如果发布更多的代码,这会有所帮助,我想你做一个dataView.refresh()过滤器清除后?你有包括这个吗?

dataView.onRowCountChanged.subscribe(function (e, args) { 
    grid.updateRowCount(); 
    grid.render(); 
}); 
+0

是的...我已经包括了这个..我上传我的整个电网代码。可能是我没有把你的代码包含在适当的地方。还有一件事....一旦你搜索一些东西后滚动或排序网格,它就会正确更新。 – 2013-05-18 09:12:06

0

我解决了......变化被评论了。

dataView.onRowCountChanged.subscribe(function (e, args) { 
     grid.updateRowCount(); 
     grid.invalidate();   // added 
     grid.render(); 
     }); 
dataView.onRowsChanged.subscribe(function (e, args) { 
     grid.invalidateRows(args.rows); 
     grid.invalidate();   // added 
     grid.render(); 
     });