更新数据时,ag-grid cell-renderer 组件失去了可点击性

Posted

技术标签:

【中文标题】更新数据时,ag-grid cell-renderer 组件失去了可点击性【英文标题】:ag-grid cell-renderer component loses its click-ability when data are updated 【发布时间】:2020-06-20 19:35:11 【问题描述】:

我有一个简单的角度组件,它实现了这样的 ag-grid:

<ag-grid-angular
  *ngIf="data"
  domLayout='autoHeight'
  class="ag-theme-material"
  suppressFieldDotNotation="true"
  [pagination]="true"
  [paginationPageSize]="5"
  [defaultColDef]="defaultColDef"
  [gridOptions]="gridOptions"
  [frameworkComponents]="frameworkComponents"
  [rowData]="data.rowData"
  [columnDefs]="data.columnDefs"
  (gridReady)="onGridReady($event)"
  (cellKeyPress)="onCellKeyPress($event)">
</ag-grid-angular>

然后我在需要显示可网格数据的其他组件中使用此组件。

<shared-grid [data]="projectStore.datasetsGridData | async" (action)="onDatasetsTableAction($event)"></shared-grid>

如您所见,我使用 observable 来设置网格的 columnDefsrowData

网格被配置为使用cellRenderer 组件,该组件在其中一个列中实现可点击元素,例如:

<div (click)="doSomething()">...</div>

我注意到,对于那些数据 ([data] input) 不断更改具有自定义可点击 div 的单元格的网格,只要数据发生更改,它就会失去其可点击性。当新数据停止出现时,div 可以再次点击。

我认为这是由于不断刷新网格而发生的,但我不能 100% 确定。如果是这种情况,是否有任何解决方法可以阻止这种影响发生?

【问题讨论】:

【参考方案1】:

这个问题有两种可能的解决方案。

    您可以在 cellRenderer 中实现 refresh() 方法 组件并处理刷新逻辑,以便单元格渲染器 如果有数据刷新,组件知道该怎么做。这是一个 示例 - Handling refresh 在你这样做之前,有 如果您在单元格渲染器上调用刷新的多种原因 没有使用首选的api方法来设置数据,然后刷新 不叫。您将不得不手动调用 api.refreshCells()上述解决方案每次刷新数据时 工作。更多信息在这里 - Events causing refresh

    如果解决方案 1 很麻烦,那么简单的方法是在每次数据更改时使用 api.redrawRows()。想想ngOnChanges。重绘行重新创建行的整个 DOM 并再次应用单元格渲染器,就好像行是新创建的一样。 根据文档 -

如果您想从头开始重新创建行,请使用重绘行。这 当您更改了仅在以下情况下使用的属性时很有用 该行是第一次创建的,例如:

    该行是否为 fullWidth。 用于任何单元格的 cellRenderer(因为在创建单元格时指定了一次)。 你想要 通过回调为行指定不同的样式 getRowStyle() 或 getRowClass()。

示例 - Redraw rows

【讨论】:

以上是关于更新数据时,ag-grid cell-renderer 组件失去了可点击性的主要内容,如果未能解决你的问题,请参考以下文章

如何在表初始化后更新 ag-Grid 的 autoGroupColumnDef 属性

使用 React 加载新表后使用新数据更新 ag-grid

如果使用带有 Angular 6 的 ag-Grid 执行全行更新,则获取已编辑的列(带有数据)

Ag-grid 在两个网格之间同步数据

ag-grid - 数据更改时调整细节高度

如何使用 ag-grid 的布尔数据复选框