表filter不使用退格键
我正在根据http://docs.handsontable.com/0.15.0-beta6/demo-search-for-values.html上的内置搜索function,使用handontable复制一个实时filter框。
现在我有一个基本的设置工作在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 []
我该如何解决这个问题,以便空字符串再次显示整个未过滤的表格?
您可以在.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; });