0

データビュー モデルの 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();
          });
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 に答える