0

我在 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();
          });
4

2 回答 2

0

如果您发布更多代码会有所帮助,我想您在清除过滤器后执行 dataView.refresh() ?你包括了这个吗?

dataView.onRowCountChanged.subscribe(function (e, args) {
  grid.updateRowCount();
  grid.render();
});
于 2013-05-14T14:23:58.360 回答
0

I solved it......the changes are commented.

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();
      });
于 2013-05-18T11:02:46.380 回答