Turbotable :p-tableHeaderCheckbox 选择禁用的行

Turbotable : p-tableHeaderCheckbox selects disabled lines

我在 PrimeNG TurboTable 上遇到问题。

我从以下示例开始:https://www.primefaces.org/primeng/#/table/selection 尤其是复选框选择示例。

唯一的区别是在一些 p-tableCheckbox 上我添加了一个 [disabled]="true"

如果我 select 一个禁用的行它不会激活并且不能被 selected,这非常有效,但是当我点击 p-tableHeaderCheckbox 时所有的行都是 select甚至禁用了行。

此外,selection 还会计算处于禁用状态的行,或者它应该只计算没有禁用状态的行 我在 stackblitz 上做了一个例子:https://stackblitz.com/edit/angular-gnbsml?file=src%2Fapp%2Fapp.component.html

如何防止 tableHeaderCheckbox 也 select 禁用行?

提前感谢您的回答

您可以在 table 的 (selectionChange) 回调中阻止选择。将 [(selection)] 分成两部分:

[selection]="selectedRowData" (selectionChange)="onSelectionChange($event)"

给组件添加 onSelectionChange 方法:

  onSelectionChange(selection: any[]) {
    for (let i = selection.length - 1; i >= 0; i--) {
      let data = selection[i];
      if (this.isRowDisabled(data)) {
        selection.splice(i, 1);
      }
    }
    this.selectedRowData = selection;
 }

同时添加 isRowDisabled 方法:

  isRowDisabled(data: any): boolean {
    return data.color === 'orange'
  }

并更改 tableCheckbox 的模板以使用 isRowDisabled(它仅用于在一个地方检查)

<p-tableCheckbox [value]="rowData" [disabled]="isRowDisabled(rowData)"></p-tableCheckbox>

参见 https://stackblitz.com/edit/angular-hnzxs2 上的示例(我还添加了从计算 headerCheckBox 状态的过程中排除禁用行的逻辑)

当我们仅在过滤后禁用行时失败。我已通过检查活动行修复它。

ngAfterViewInit(): void {
    const orig_updateCheckedState = this._headerCheckBox.updateCheckedState;
    const me = this;
    this._headerCheckBox.updateCheckedState = function() {
        const cars: any[] = me._table.filteredValue || me._table.value;
        const selection: any[] = me._table.selection;
        let actRows: boolean = false;
        for (const car of cars) {
            if (!me.isRowDisabled(car)) {
                actRows = true;
                const selected = selection && selection.indexOf(car) >= 0;
                if (!selected) return false;
            }
        }
        if (actRows) {
            return true
        } else {
            return false;
        }
    };
}