【问题标题】:keep filter after ag-grid update在 ag-grid 更新后保留过滤器
【发布时间】:2018-11-05 02:00:08
【问题描述】:

我正在尝试在更新一行后保留网格的过滤器。

当我单击网格中的一行时,我会打开一个对话框,在其中更新该行的信息,然后在网格的 rowData 中查找单击的行,然后使用对话框中的值,如下所示:

row[0].x = dg.x;
row[0].y = dg.y;
dg.gridOptions.rowData[index] = row[0];
dg.gridOptions.api.setRowData(newRows);

但在此之后我松开了网格上的过滤器,我做了一些搜索,并尝试了以下所有解决方案:

  1. gridOptions 属性deltaRowDataMode 设置为true

  2. filterParams: {apply: true, newRowsAction: 'keep'}

但这些都不起作用。

我该如何解决这个问题?

【问题讨论】:

  • 网格后,使用 getFilterInstance() 再次应用过滤器
  • 显示您的updateGrid 函数和任何其他相关代码。您可能需要以不同的方式进行更新。 ag-grid.com/javascript-grid-data-update
  • @thirtydot 请检查我的编辑。
  • 好吧,如果你想保留你的过滤器选择,你不能使用setRowData,这是我之前评论中链接的引用:“当你调用 api.setRowData(newData) 时,网格丢弃所有先前的选择和过滤器,并用新数据完全覆盖旧数据。”。通读docs 并查看演示/代码以找到解决方案。如果您需要更多帮助,请告诉我,我会写一个答案。

标签: javascript angularjs ag-grid


【解决方案1】:

你可以设置 filterParams newRowsAction 保持,像这样

dg.defaultColDef = { filterParams: { newRowsAction: 'keep'}} ;

参考https://www.ag-grid.com/javascript-grid-filtering/index.php

【讨论】:

    【解决方案2】:

    使用此方法 (gridOptions.api.refreshCells()) 而不是 setRowData。或者如果您需要使用setRowData,请在调用之前保存过滤器模型,然后使用这些方法再次应用过滤器:

    const model = this.gridOptions.api.getFilterModel();
    //some code
    this.gridOptions.api.setFilterModel(model);
    

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题,这就是我为解决它所做的事情(有点骇人听闻)。

      1. 订阅农业网格的rowDataChanged事件。
      (rowDataChanged)="onRowDataChanged($event)"
      
      1. onRowDataChanged 中放置您的过滤逻辑
      // Get a reference to the name filter instance
      const filterInstance = this.gridApi.getFilterInstance('fieldNameHere');
      // Call some methods on Set Filter API that don't apply the filter
      filterInstance.setModel({
          type: 'contains', // type of filter
          filter: 'yourData' // set filter on data
      });
      // Get grid to run filter operation again
      this.gridApi.onFilterChanged();
      

      onRowDataChanged 将被触发两次,第一次是在网格清除所有内容时,第二次是在重新加载数据时。所以,你应该设置一些条件来避免任何错误。

      例如,我需要从刷新后加载的数据中设置过滤器,这就是我所做的:

      const filtered = this.rowData.filter(x => x.Id === this.Id);
      if (filtered.length > 0) {
          // Get a reference to the name filter instance
          const filterInstance = this.gridApi.getFilterInstance('fieldNameHere');
          // Call some methods on Set Filter API that don't apply the filter
          filterInstance.setModel({
              type: 'contains', // type of filter
              filter: filtered[0].name // set filter on data
          });
          // Get grid to run filter operation again
          this.gridApi.onFilterChanged();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-03
        • 2020-06-30
        • 2019-08-16
        • 2020-09-02
        • 2019-03-15
        • 2020-11-04
        • 2020-06-12
        • 2019-07-28
        相关资源
        最近更新 更多