2013-05-13 35 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(); 
     });