データビュー モデルの slickgrid で検索フィルターを使用しています。時々うまくいきますが、常にではありません。
例えば、
(1) 私のグリッドには 4 つの行があります。
(2) 最初の行を検索すると、他の 3 行が削除されます (正しい)。
(3) ただし、検索テキストを削除すると、4 行すべてが理想的に表示されるはずですが、グリッドには、以前に検索された行を 2 回含む 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();
});