如何获取和重置 ag-grid 表的状态?我的意思是,显示哪些列,以什么顺序显示,进行什么排序和过滤等。
更新:getColumnState 和 setColumnState 似乎接近我想要的,但我无法弄清楚我应该保存和恢复状态的回调。我尝试在 onGridReady 中恢复它,但是当加载实际行时,我丢失了状态。
他们的网站上有一个非常具体的例子,提供了您要执行的操作的详细信息:javascript-grid-column-definition
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');
}
我相信您正在寻找文档的此页面。这描述了列 api 以及您可以使用哪些功能。最相关的功能是:
getAllDisplayedColumns()
- 用于显示哪些列能够呈现到显示中。由于虚拟化,可能有一些列尚未呈现到 DOM,如果您只想将列渲染到 DOM 然后使用getAllDisplayedVirtualColumns()
- 这两个函数都显示顺序,因为它们将显示在网页上- 从这些函数返回的
Column
对象包含每个列的排序和筛选属性。
- 从这些函数返回的
我相信您所需要的一切都可以从该函数中获得,该函数将像这样调用gridOptions.columnApi.getAllDisplayedColumns()
其他可能有用的功能:
- 可从
gridOptions.columnApi
:getColumnState()
- 返回比上述功能更详细的对象 - 只有:aggFunc,colId,hide,pinned,pivotIndex,rowGroupIndex和widthsetColumnState(columnState)
- 这允许您将列设置为隐藏、可见或固定,columnState
应该是从getColumnState()
返回的内容
- 可从
gridOptions.api
获得 :getSortModel()
- 获取当前排序模型setSortModel(model)
- 设置网格的排序模型,model
应与从getSortModel()
返回的格式相同getFilterModel()
- 获取当前筛选器模型setFilterModel(model)
- 设置网格的筛选器模型,model
应与从getFilterModel()
返回的格式相同
还有其他更具体的功能,如果您只想弄乱固定列,您可以使用setColumnPinned
或一次使用多个列setColumnsPinned
并且更多功能可从 AG-Grid 文档的链接页面获得
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 秒
要保留您可以使用的过滤器值 filterParams: {newRowsAction: 'keep'}
这是我的方法。 它只涉及使用与实例化 agGrid 相同的 API 创建一个包装器函数。
此函数中的一些有趣的事情
- 保存/加载到本地存储
- 利用
options
对象传入Grid
函数后可用的addEventListener
。 - 附加到
options
对象的onGridReady
回调,而不擦除可能已定义的内容。
用法:
newAgGrid(document.getElementById('my-grid'), options);
static newAgGrid(element, options) {
const ls = window.localStorage;
const key = `${location.pathname}/${element.id}`;
const colStateKey = `${key}colstate`;
const sortStateKey = `${key}sortState`;
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;
}
我们可以使用以下方式使用useRef()
来引用<AgGridReact>
元素来访问 getColumn 和 setColumn 状态。
const GridRef = useRef()
GridRef.current.columnApi.getColumnState() // get Column state value
GridRef.current.columnApi.setColumnState() // set Column state value
<AgGridReact
enableFilter={true}
rowStyle={rowStyle}
ref={GridRef}
></AgGridReact>
需要执行以下操作。
在 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 .它用角度完成