Ag-grid降序排序时如何将文件夹固定至底部?
实现AG Grid名称降序时文件夹固定在底部的方案
嘿,刚好之前处理过类似的需求,这就给你捋清楚具体实现思路和代码!
你已经用到了postSort钩子,核心思路就是根据当前的排序方向,动态调整文件夹和报表的排序优先级:
- 名称列升序时:文件夹排在报表前面,各自内部按名称升序排序
- 名称列降序时:报表排在文件夹前面,各自内部按名称降序排序
具体代码实现
假设你的行数据里有isFolder字段用来区分文件夹/报表,name字段是名称列的绑定字段,那可以这样写postSort函数:
postSort: function(params) { // 先确认当前是按名称列触发的排序 const nameSortConfig = params.sortModel.find(item => item.colId === 'name'); if (!nameSortConfig) return; const sortDirection = nameSortConfig.sort; const allRows = params.nodes.map(node => node.data); // 把数据拆分为文件夹和报表两组 const folderRows = allRows.filter(row => row.isFolder); const reportRows = allRows.filter(row => !row.isFolder); let sortedResult; if (sortDirection === 'asc') { // 升序:文件夹在前,各自按名称升序排列 sortedResult = [ ...folderRows.sort((a, b) => a.name.localeCompare(b.name)), ...reportRows.sort((a, b) => a.name.localeCompare(b.name)) ]; } else { // 降序:报表在前,各自按名称降序排列 sortedResult = [ ...reportRows.sort((a, b) => b.name.localeCompare(a.name)), ...folderRows.sort((a, b) => b.name.localeCompare(a.name)) ]; } // 将排序后的结果映射回网格节点,更新显示顺序 params.nodes.forEach((node, index) => { node.setData(sortedResult[index]); }); }
关键细节说明
- 锁定排序列:先从
sortModel中筛选出名称列的排序配置,确保只有按名称排序时才触发自定义逻辑 - 分组拆分:把行数据拆成文件夹和报表两个独立数组,避免混排干扰优先级
- 方向适配:升序/降序时调换两组的顺序,同时各自内部保持对应方向的名称排序
- 更新网格:通过
node.setData将排序后的行数据重新绑定到节点,让网格渲染正确顺序
如果你的字段名不是isFolder或name,只需要替换成你实际使用的字段即可~
内容的提问来源于stack exchange,提问作者Deepender Sharma
相关产品推荐
相关产品推荐

