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() 事件类似的事件,但在将排序应用到网格之前被调用的事件。
我正在通过 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() 事件类似的事件,但在将排序应用到网格之前被调用的事件。