2

我有以下标记:

<table>
  <thead>
    <th *ngFor="let column of columnNames">
      <ng-container *ngIf="column === 'Column6'; else normalColumns">
        {{column}} <input type="checkbox" #chkAll />
      </ng-container>
      <ng-template #normalColumns>
        {{column}}
      </ng-template>
    </th>
  </thead>
  <tbody>
    <tr>
      <td *ngFor="let model of columnValues">
        <ng-container *ngIf="model === 'Value6'; else normal">
        {{model}} <input type="checkbox" [checked]="chkAll?.checked" />
      </ng-container>
      <ng-template #normal>
        {{model}}
      </ng-template>
      </td>
    </tr>
  </tbody>
</table>

我想实现“全选”功能。

如您所见,我在表头中有条件,如果表头名称等于某个值,则在该表头上添加一个输入。在表体中,我还有一个条件,是否应该checkbox在列中添加一个。

当我选择#chkAll表头中的复选框时,我希望下面行中的复选框也被选中。我以为这样[checked]="chkAll?.checked"checkboxes可以解决问题,但它不起作用。

是我的 Stackblitz

4

2 回答 2

3

由于chkAll变量是在单独的模板中定义的(由ngFor表头的循环创建),因此它在表体的标记中不可用。

您可以在标题复选框值更改时调用组件方法,以执行行中复选框的选中/取消选中:

<table>
  <thead>
    <th *ngFor="let column of columnNames">
      <ng-container *ngIf="column === 'Column6'; else normalColumns">
        {{column}} <input type="checkbox" ngModel (ngModelChange)="checkAllBoxes($event)" />
      </ng-container>
      ...
    </th>
  </thead>
  <tbody>
    <tr>
      <td *ngFor="let model of columnValues">
        <ng-container *ngIf="model === 'Value6'; else normal">
          {{model}} <input type="checkbox" #chkBox />
        </ng-container>
        ...
      </td>
    </tr>
  </tbody>
</table>

checkAllBoxes方法使用QueryList提供的 byViewChildren来访问复选框:

@ViewChildren("chkBox") private chkBoxes: QueryList<ElementRef>;

checkAllBoxes(value: boolean) {
  this.chkBoxes.forEach(chk => {
    chk.nativeElement.checked = value;
  });
}

请参阅此 stackblitz以获取演示。

于 2018-09-25T15:29:39.780 回答
2

另一种方法如下:

在您的模板中:

<table>
  <thead>
    <th *ngFor="let column of columnNames">
      <ng-container *ngIf="column === 'Column6'; else normalColumns">
        {{column}} <input type="checkbox" #chkAll ngModel (change)="checkAll = chkAll.checked" />
      </ng-container>
      <ng-template #normalColumns>
        {{column}}
      </ng-template>
    </th>
  </thead>
  <tbody>
    <tr>
      <td *ngFor="let model of columnValues">
        <ng-container >
        {{model}} <input type="checkbox" [(checked)]="checkAll" />
      </ng-container>
      <ng-template #normal>
        {{model}}
      </ng-template>
      </td>
    </tr>
  </tbody>
</table>

在您的组件中:

创建一个名为 checkAll 的布尔值。

这里是 Stackblitz

于 2018-09-25T15:35:22.640 回答