我正在根据http://docs.handsontable.com/0.15.0-beta6/demo-search-for-values.html的内置搜索功能,使用handontable复制一个实时过滤器框。
现在我已经在http://jsfiddle.net/uL3L4teL/4/
进行了基本设置如文档中所述,在此代码中,如果输入搜索字符串,则使用以下函数获取输出到控制台的匹配单元格:
Handsontable.Dom.addEvent(searchFiled, 'keyup', function (event) {
var queryResult = hot.search.query(this.value);
console.log(queryResult);
// ...
});
我想抓取数据数组中与搜索字符串匹配的行,并在重新显示表之前通过搜索字符串过滤原始数据“数据”。这部分可以使用:
Handsontable.Dom.addEvent(searchFiled, 'keyup', function (event) {
// debugger
hot.loadData(tData);
var queryResult = hot.search.query(this.value);
rows = getRowsFromObjects(queryResult);
console.log('searchFiled',searchFiled.value);
console.log('rows',rows);
console.log('tData', tData);
var filtered = tData.filter(function (d, ix) {
return rows.indexOf(ix) >= 0;
});
console.log('filtered', filtered);
hot.loadData(filtered);
});
然而,当我运行这个时,我在控制台中看到以下内容,当我输入'n'后跟退格(以清空搜索字符串)时:
输入'n':
rows [0, 1]
searchFiled n
rows [0, 1]
tData [Array[4], Array[4], Array[4], Array[4]]
filtered [Array[4], Array[4]]
退格(以清空搜索值):
rows []
searchFiled
rows []
tData [Array[4], Array[4], Array[4], Array[4]]
filtered []
如何修复此问题,以便空字符串再次显示整个未过滤的表?
答案 0 :(得分:3)
如果值.filter()
为空或未定义,您可以在searchFiled.value
方法内添加一个条件,该条件将返回所有行:
var filtered = tData.filter(function(_, index) {
if (searchFiled.value) {
return rows.indexOf(index) >= 0;
} else {
return true;
}
});
或者,这里是一个单行程,它做同样的事情(虽然它不太可读):
var filtered = tData.filter(function(_, index) {
return !searchFiled.value || rows.indexOf(index) >= 0;
});