ag-Grid 设置过滤器和排序模型而不触发事件

ag-Grid set filter and sort model without triggering event

我正在通过 api:

更新排序和过滤模型
this.gridApi.setFilterModel(filterModels);
this.gridApi.setSortModel(sortModels);

这个问题是我有一个服务器请求绑定到排序和过滤器的更改,所以当用户更改时,数据也会更新。这意味着当我更改代码模型(如恢复状态或重置过滤器)时,它会导致多个请求。

有没有办法在不触发事件的情况下更新 filter/sort 模型?

我看到有一个 ColumnEventType 参数,但看不到它是如何工作的。我可以指定一些我可以在我的事件处理程序中查找的变量,让它们忽略不是由用户生成的调用吗?

我正在尝试管理 URL 状态,因此当 url 查询参数更改时,我的代码会在网格中设置模型,但这最终导致页面重新加载多次,因为 onFilter 和 onSort设置模型时会调用事件,我无法想象如何阻止这种情况。

届时,您将不得不自己管理它,即,就在您调用 setModel 之前,以某种方式在您的应用程序的共享部分(可能是全局变量)标记它

然后当你对这些事件做出反应时,检查它的属性,猜测它来自哪里。

请注意,目前我们已将源添加到列事件中,但还没有为模型事件添加源,虽然我们计划添加它们,但我们还没有预计到达时间

希望对您有所帮助

我不得不解决类似的问题。我找到了适合我这种情况的解决方案。也许这对某人有帮助。

for (let j = 0; j < orders.length; j++) {
    const sortModelEntry = orders[j];
    if (typeof sortModelEntry.property === 'string') {
    const column: Column = this.gridColumnApi.getColumn(sortModelEntry.property);
    if (column && ! column.getColDef().suppressSorting) {
       column.setSort(sortModelEntry.direction.toLowerCase());
       column.setSortedAt(j);
     }
}
this.gridApi.refreshHeader();

其中 orders 是键值对象数组,其中键是列名,值是排序指令 (asc/desc)。

设置不刷新的过滤器很复杂

for (let j = 0; j < filters.length; j++) {
   const filterModelEntry = filters[j];
   if (typeof filterModelEntry.property === 'string') {
      const column: Column = this.gridColumnApi.getColumn(filterModelEntry.property);
      if (column && ! column.getColDef().suppressFilter) {
         const filter: any = this.gridApi.getFilterApi(filterModelEntry.property);
         filter['filter'] = filterModelEntry.command;
         filter['defaultFilter'] = filterModelEntry.command;
         filter['eTypeSelector'].value = filterModelEntry.command;
         filter['filterValue'] = filterModelEntry.value;
         filter['filterText'] = filterModelEntry.value;
         filter['eFilterTextField'].value = filterModelEntry.value;
         column.setFilterActive(true);
      }
   }
}

过滤器中的属性:

  • 属性 - 列名
  • 命令 - 过滤操作(包含、等于、...)
  • value - 过滤器中使用的值

对于在 2020 年 11 月寻找此问题解决方案的任何其他人,利用 onFilterModified() 可能会有所帮助。这在 onFilterChanged() 之前被调用,因此在此处设置一个值(例如 hasUserManuallyChangedTheFilters = false 等)并在过滤器更改事件中检查相同值是一种可能的解决方法。虽然,我还没有发现任何与 onSortChanged() 事件类似的事件,但在将排序应用到网格之前被调用的事件。