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

时间:2018-10-07 23:35:11

标签: ag-grid

我正在通过api更新排序和过滤器模型:

this.gridApi.setFilterModel(filterModels);
this.gridApi.setSortModel(sortModels);

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

是否可以在不触发事件的情况下更新过滤器/排序模型?

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

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

3 个答案:

答案 0 :(得分:0)

那时,您将必须自己管理它,即,在调用setModel之前,以某种方式在应用程序的共享部分(可能是全局变量)中对此进行标记

然后,当您对这些事件做出反应时,请检查其性质,以猜测其来源。

请注意,目前,我们已将事件源添加到了列事件中,但尚未将它们用于模型事件中,尽管我们计划将其添加,但我们没有ETA

希望这会有所帮助

答案 1 :(得分:0)

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

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是键值对象的数组,其中key是列名,而值是排序指令(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);
      }
   }
}

过滤器中的属性:

  • 属性-列名
  • 命令-筛选器动作(包含,等于,...)
  • 值-过滤器中使用的值

答案 2 :(得分:0)

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