我在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 :(得分:0)
如果您发布更多代码会有所帮助,我想您在清除过滤器后执行dataView.refresh()会有所帮助吗?你有这个吗?
dataView.onRowCountChanged.subscribe(function (e, args) {
grid.updateRowCount();
grid.render();
});
答案 1 :(得分: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();
});