我在 slickgrid 中为 dataview 模型使用搜索过滤器。它有时可以正常工作,但并非总是如此。
例如,
(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();
});