如何获取和设置 ag-grid 状态?

Posted

技术标签:

【中文标题】如何获取和设置 ag-grid 状态?【英文标题】:How do I get and set ag-grid state? 【发布时间】:2017-08-06 06:23:30 【问题描述】:

如何获取并重新设置 ag-grid 表的状态?我的意思是,正在显示哪些列,以什么顺序,以什么排序和过滤等等。

更新:getColumnState 和 setColumnState 似乎接近我想要的,但我无法弄清楚我应该保存和恢复状态的回调。我尝试在 onGridReady 中恢复它,但是当实际的行被加载时,我失去了状态。

【问题讨论】:

我不确定我是否了解您的应用程序流程,我认为我们需要它来回答您应该在哪里“恢复状态”。保存状态和恢复状态之间发生了什么? @Pablo 你有示例代码吗? 警告用户集分组时的自动聚合将在 setColumnState 后停止工作 请帮助***.com/questions/65018177/… 【参考方案1】:

在他们的网站上有一个非常具体的示例,提供了您尝试执行的操作的详细信息:javascript-grid-column-definitions

function saveState() 
    window.colState = gridOptions.columnApi.getColumnState();
    window.groupState = gridOptions.columnApi.getColumnGroupState();
    window.sortState = gridOptions.api.getSortModel();
    window.filterState = gridOptions.api.getFilterModel();
    console.log('column state saved');

以及用于恢复:

function restoreState() 
    gridOptions.columnApi.setColumnState(window.colState);
    gridOptions.columnApi.setColumnGroupState(window.groupState);
    gridOptions.api.setSortModel(window.sortState);
    gridOptions.api.setFilterModel(window.filterState);
    console.log('column state restored');

【讨论】:

如果您想在发生变化时保存状态,您可以将事件处理程序添加到您的网格选项中,如下所示: onSortChanged: () => saveState() , onFilterChanged: () => saveState () , onColumnResized: () => saveState() , onColumnMoved: () => saveState() 【参考方案2】:

我相信您正在寻找this page of the Docs。这描述了列 api 以及您可以使用哪些功能。最相关的功能是:

getAllDisplayedColumns() - 用于显示哪些列能够呈现到显示器中。由于虚拟化,可能有一些列还没有渲染到 DOM,如果你只想要渲染到 DOM 的列然后使用getAllDisplayedVirtualColumns() - 这两个函数都显示了它们将显示在网页上的顺序 从这些函数返回的Column 对象包含每个列的排序和过滤属性。

我相信你需要的所有东西都可以从这个函数中获得,就像这样gridOptions.columnApi.getAllDisplayedColumns()

其他可能有用的功能:

可从gridOptions.columnApi 获得: getColumnState() - 返回比上述函数更详细的对象 - 只有:aggFunc、colId、hide、pinned、pivotIndex、rowGroupIndex 和 width setColumnState(columnState) - 这允许您将列设置为隐藏、可见或固定,columnState 应该是从 getColumnState() 返回的内容 可从gridOptions.api 获得: getSortModel() - 获取当前排序模型 setSortModel(model) - 设置网格的排序模型,model 应该与getSortModel() 返回的格式相同 getFilterModel() - 获取当前过滤器模型 setFilterModel(model) - 设置网格的过滤器模型,model 应该与getFilterModel() 返回的格式相同

还有其他更具体的功能,如果您只想固定一个列,您可以使用setColumnPinned 或一次使用多个列setColumnsPinned,更多功能可从 AG 的链接页面获得-网格文档

【讨论】:

感谢您的回答。你知道我应该在哪个回调中将状态恢复到网格吗? @pupeno 用于恢复列状态,可以使用 gridOptions.columnApi.setColumnState(colState);在 onGridReady() 事件中【参考方案3】:

gridReady 事件应该执行您需要它执行的操作。我怀疑正在发生的事情是,当您使用数据更新网格时,您的过滤器状态正在重置 - 您可以通过设置 filterParams: newRowsAction: 'keep'

来更改此行为

这可以按列设置,也可以使用defaultColDef 全局设置。

这是一个适合您的示例配置:

var gridOptions = 
    columnDefs: columnDefs,
    enableSorting: true,
    enableFilter: true,
    onGridReady: function () 
        gridOptions.api.setFilterModel(filterState);
        gridOptions.columnApi.setColumnState(colState);
        gridOptions.api.setSortModel(sortState);
    ,
    defaultColDef: 
        filterParams: newRowsAction: 'keep'
    
;

我在这里创建了一个 plunker 来说明它是如何工作的(注意我正在从硬代码字符串恢复状态,但同样的原则适用):https://plnkr.co/edit/YRH8uQapFU1l37NAjJ9B。 rowData 设置为加载后 1 秒超时

【讨论】:

【参考方案4】:

要保留您可能使用的过滤器值 filterParams: newRowsAction: 'keep'

【讨论】:

【参考方案5】:

这是我的方法。它只涉及使用与实例化 agGrid 相同的 API 创建一个包装函数。

这个函数的一些有趣的事情

保存/加载到本地存储 使用addEventListener,一旦它被传递给Grid 函数,它就可供options 对象使用。 附加到options 对象的onGridReady 回调,而不删除可能已经定义的内容。

用法:

newAgGrid(document.getElementById('my-grid'), options);
    
static newAgGrid(element, options) 
    const ls = window.localStorage;
    const key = `$location.pathname/$element.id`;
    const colStateKey = `$keycolstate`;
    const sortStateKey = `$keysortState`;
    function saveState(params) 
        if (ls) 
            ls.setItem(colStateKey, JSON.stringify(params.columnApi.getColumnState()));
            ls.setItem(sortStateKey, JSON.stringify(params.api.getSortModel()));
        
    
    function restoreState(params) 
        if (ls) 
            const colState = ls.getItem(colStateKey);
            if (colState) 
                params.columnApi.setColumnState(JSON.parse(colState));
            
            const sortState = ls.getItem(sortStateKey)
            if (sortState) 
                params.api.setSortModel(JSON.parse(sortState));
            
        
    
    // monitor the onGridReady event.  do not blow away an existing handler
    let existingGridReady = undefined;
    if (options.onGridReady) 
        existingGridReady = options.onGridReady;
    
    options.onGridReady = function (params) 
        if (existingGridReady) 
            existingGridReady(params);
        
        restoreState(params);
    
    // construct grid
    const grid = new agGrid.Grid(element, options);
    // now that grid is created, add in additional event listeners
    options.api.addEventListener("sortChanged", function (params) 
        saveState(params);
    );
    options.api.addEventListener("columnResized", function (params) 
        saveState(params);
    );
    options.api.addEventListener("columnMoved", function (params) 
        saveState(params);
    );
    return grid;

【讨论】:

【参考方案6】:

需要做以下事情。

在您的 html 中包含网格的 div

<div id="myGrid" style="width: 500px; height: 200px;"></div>

在js端

//initialize your grid object
var gridDiv = document.querySelector('#myGrid');



//Define the columns options and the data that needs to be shown
        var gridOptions = 
            columnDefs: [
                headerName: 'Name', field: 'name',
                headerName: 'Role', field: 'role'
            ],
            rowData: [
                name: 'Niall', role: 'Developer',
                name: 'Eamon', role: 'Manager',
                name: 'Brian', role: 'Musician',
                name: 'Kevin', role: 'Manager'
            ]
        ;

//Set these up with your grid
        new agGrid.Grid(gridDiv, gridOptions);

查看此笔了解更多功能。 https://codepen.io/mrtony/pen/PPyNaB 。它用角度完成

【讨论】:

以上是关于如何获取和设置 ag-grid 状态?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 React AG-grid 中获取固定的行数据

如何通过ag-grid中的角度材质菜单获取行数据

如何在ag-grid Angular中获取其他列单元格但同一行的值?

在一列上设置过滤器和提供的过滤器 - Ag-Grid

如何在ag-grid中默认对列进行排序?

无论 ag-Grid 中的 colDef 可编辑值如何,如何禁用整个网格?