私はこの問題の答えを探しましたが、それでも立ち往生しています。すべての行にチェックボックスが付いた複数の行を持つテーブルがあり、すべてを選択および選択解除するためのチェックボックスが必要です。
テンプレート
<table class="table table-bordered table-condensed table-striped table-hover">
<thead>
<tr>
<th></th>
<th>Size</th>
<th>Diameter</th>
<th class="text-center">
<input type="checkbox" name="all" (change)="checkAll($event)"/>
</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let size of sizes | async ; let i = index">
<td class="text-right">{{i + 1}}</td>
<td class="text-right">{{size.size}}</td>
<td>{{size.diameter}}</td>
<td class="text-center">
<input type="checkbox" name="sizecb[]" value="{{size.id}}"/>
</td>
</tr>
</tbody>
コンポーネント
export class ListSizeComponent implements OnInit {
constructor () {
}
sizes: any;
setSizes() {
this.sizes = [
{'size': '0', 'diameter': '16000 km'},
{'size': '1', 'diameter': '32000 km'}
]
}
checkAll(ev) {
if (ev.target.checked) {
console.log("True")
} else {
console.log("False");
}
}
ngOnInit(): void {
this.setSizes();
}
}
そのためにngModel
を活用できます。
テンプレート:
<input type="checkbox" name="all" [checked]="isAllChecked()" (change)="checkAll($event)"/>
....
<input type="checkbox" name="sizecb[]" value="{{size.id}}" [(ngModel)]="size.state"/>
コンポーネント:
checkAll(ev) {
this.sizes.forEach(x => x.state = ev.target.checked)
}
isAllChecked() {
return this.sizes.every(_ => _.state);
}
これはなしを使用して行うことができます[((ngModel)]も使用します!
コンポーネント「ListSizeComponent」でブール変数「isSelected」を宣言してfalseに初期化するだけです。そして、すべてのチェックボックスに[Checked] = "isSelected"プロパティを追加します。そして、以下の「すべて」チェックボックスの変更イベントを追加します。 (change)= "isSelected = true"。
したがって、コードは次のようになります。
<table class="table table-bordered table-condensed table-striped table-hover">
<thead>
<tr>
<th></th>
<th>Size</th>
<th>Diameter</th>
<th class="text-center">
<input type="checkbox" name="all" (change)="isSelected = true"/>
</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let size of sizes | async ; let i = index">
<td class="text-right">{{i + 1}}</td>
<td class="text-right">{{size.size}}</td>
<td>{{size.diameter}}</td>
<td class="text-center">
<input type="checkbox" name="sizecb[]" value="{{size.id}}"
[checked]="isSelected"/>
</td>
</tr>
</tbody>
</table>
成分:
export class ListSizeComponent implements OnInit {
constructor () {
}
sizes: any;
isSelected = false;
setSizes() {
this.sizes = [
{'size': '0', 'diameter': '16000 km'},
{'size': '1', 'diameter': '32000 km'}
]
}
ngOnInit(): void {
this.setSizes();
}
HTMLファイル:
すべてのチェックボックスを選択します。
<div class="col-sm-6">
<input type="checkbox" (change)="isSelected = !isSelected"> Select all
</div>
選択するチェックボックスのリスト:
<div class="col-sm-6" *ngFor="let feature of features">
<input type="checkbox" [checked]="isSelected"> {{feature.text}}
</div>
すべて選択チェックボックスを実行するためのサンプルコード。
<li> <input type="checkbox" [(ngModel)]="selectedAll" (change)="selectAll();"/>
</li>
<li *ngFor="let n of names">
<input type="checkbox" [(ngModel)]="n.selected" (change)="checkIfAllSelected();">
{{n.name}}
</li>
.....
selectAll() {
for (var i = 0; i < this.names.length; i++) {
this.names[i].selected = this.selectedAll;
}
}
checkIfAllSelected() {
this.selectedAll = this.names.every(function(item:any) {
return item.selected == true;
})
}
選択したアイテムのngModel
または外部追跡を使用しない、よりモダンなアプローチを次に示します。純粋なMatSelectionList
アプローチ:
public toggle(list: MatSelectionList) {
if (this.isAllChecked(list)) {
list.deselectAll();
} else {
list.selectAll();
}
}
public isAllChecked(list: MatSelectionList): boolean {
// Make sure list exists
if (!list.options)
return false;
return list.options.toArray().every(o => o.selected);
}
正解は非常に簡単です(基本的にはサイード・ムハンマド・アビッドの答えを繰り返します)。
TS:
multiSelect: boolean = true;
HTML:
<table>
<tr>
<th><input type="checkbox" [checked]="multiSelect" (change)="multiSelect = !multiSelect"/></th>
<th>Value</th>
</tr>
<tr *ngFor="let item of items">
<td><input type="checkbox" [checked]="multiSelect" /></td>
<td>{{item.value}}</td>
</tr>
</table>