如何防止关闭“其他单元焦点”上的 ag-grid 中的单元格编辑

gre*_*nik 6 ag-grid ag-grid-angular

我正在使用ag-grid库在 Angular 应用程序中开发一个可编辑表格。我想继续编辑单元格(在全行编辑模式下),直到完成它,然后通过 API 手动关闭编辑器。问题是编辑器正在关闭其他单元格单击/焦点(在其他行上),如下所述

当发生以下任一情况时,网格将停止编辑:

  • 其他单元格焦点:如果网格中的焦点转到另一个单元格,编辑将停止。

如果可能的话,我不知道如何禁用它。安装onCellMouseDown()钩子没有帮助,因为该cellFocused事件是在 之前触发的cellMouseDown。因此,在我有机会拦截该mousedown事件之前,编辑就停止了。

这是我的stackblitz小摘录以及相关代码片段。

这种情况的需要是我想验证输入并且不允许用户在表单无效时退出编辑。到目前为止,我发现的唯一解决方法是,当编辑器关闭时,在编辑单元格外部进行任何单击时,我会立即在onRowEditingStopped()挂钩中重新打开它,除非编辑器已通过“确定”按钮关闭。

tsi*_*iro 2

毕竟,我已经设法提供了一个完全适合我也面临的这个问题的定制解决方案。

首先,当当前正在编辑特定行时,禁用指向未编辑行的指针事件。在 Ag-grid 的“cellEditingStarted”回调中,我添加了以下代码:

public cellEditingStarted(event: any): void {
    //not all rows are on dom ag-grid takes care of it
    const nonSelectedGridRows = document.querySelectorAll('.ag-grid-custom-row:not(.ag-row-selected):not(.ag-row-editing):not(.pointer-events-none)');

    forEach(nonSelectedGridRows, row => {
        row.classList.add("pointer-events-none");
    });
}
Run Code Online (Sandbox Code Playgroud)

因为在编辑特定单元格时,并非所有行都存在于 dom 上(Ag-grid 在滚动时创建和销毁),所以我还添加了一个在创建行时应用的 rowClassRule:

this.rowClassRules = {            
        'pointer-events-none': params => {
            if (params.api.getEditingCells().length > 0) {
                return true;
            }

            return false;
        }
    };
Run Code Online (Sandbox Code Playgroud)

CSS:

.pointer-events-none {
  pointer-events: none
}
Run Code Online (Sandbox Code Playgroud)

通过禁用指针事件,当您单击未编辑的单元格时,该单元格将不会获得焦点,因此当前编辑的单元格仍将保持在编辑模式。您可以提供自己的自定义验证解决方案并通过 API 手动关闭编辑器。完成后,您必须再次启用所有网格行的指针事件:

private enablePointerEvents(): void {
    //not all rows are on dom ag-grid takes care of it
    const nonSelectedGridRows = document.querySelectorAll('.ag-grid-custom-row.pointer-events-none');

    forEach(nonSelectedGridRows, row => {
        row.classList.remove("pointer-events-none");
    });
}
Run Code Online (Sandbox Code Playgroud)