ag-grid中GridApi.setFilterModel异常:设置后过滤模型键缺失
问题分析与解决方案
问题根源
onGridReady触发时,AG Grid仅完成了API实例的初始化,但列对应的过滤器组件可能还在异步创建过程中。直接调用setFilterModel时,未初始化完成的列过滤条件会被网格忽略,导致getFilterModel只返回部分结果。而1ms延迟本质是让浏览器执行完列初始化的任务队列,属于临时规避手段。
替代解决方案
方案1:改用firstDataRendered事件触发过滤设置
firstDataRendered事件会在网格第一次完成数据渲染后触发,此时所有列和过滤器组件都已初始化完毕,能确保过滤模型被完整设置。
onFirstDataRendered = (event: FirstDataRenderedEvent) => { this.gridApi.setFilterModel(init.filterModel); };
在网格组件配置中绑定该事件:
<ag-grid-angular [columnDefs]="columnDefs" [rowData]="rowData" (gridReady)="onGridReady($event)" (firstDataRendered)="onFirstDataRendered($event)" ></ag-grid-angular>
方案2:等待列定义加载完成后设置过滤
通过监听columnDefinitionsChanged事件,确保列定义完全加载后再执行过滤模型设置,且仅执行一次避免重复触发:
onGridReady = (event: GridReadyEvent) => { this.gridApi = event.api; this.columnApi = event.columnApi; const setFilterHandler = () => { this.gridApi.setFilterModel(init.filterModel); this.columnApi.removeEventListener('columnDefinitionsChanged', setFilterHandler); }; this.columnApi.addEventListener('columnDefinitionsChanged', setFilterHandler); };
方案3:逐个校验过滤器实例后设置
遍历过滤模型的键值对,先通过getFilterInstance校验对应列的过滤器是否已初始化,仅对已存在的过滤器设置模型,最后手动触发过滤更新:
onGridReady = (event: GridReadyEvent) => { this.gridApi = event.api; Object.entries(init.filterModel).forEach(([colKey, filterValue]) => { const filterInstance = this.gridApi.getFilterInstance(colKey); if (filterInstance) { filterInstance.setModel(filterValue); } }); this.gridApi.onFilterChanged(); };
内容的提问来源于stack exchange,提问作者Gazgolder
相关产品推荐
相关产品推荐

