#angular #typescript #angular-material
Вопрос:
Я использую «Выбрать все» в своем списке выбора, чтобы очистить любые другие выбранные параметры и выбрать ТОЛЬКО опцию «Все». Я могу удалить все выбранные параметры, но я не могу выбрать опцию «Все».
<mat-form-field class="example-full-width">
<mat-label>Select Program(s)</mat-label>
<mat-select #myprograms [formControl]="myprgrmFormControl" multiple [(ngModel)]="criteria.Program_ID" >
<mat-option (click)="toggleAllSelection()" value="ALL" >All</mat-option>
<mat-option *ngFor="let row of ProgramDropdown" [value]="row.Program_ID" >
{{row.Program_Name}} </mat-option>
</mat-select>
</mat-form-field>
В моем файле ts:
import { MatSelect } from '@angular/material/select';
import { MatOption } from '@angular/material/core';
myprgrmFormControl = new FormControl();
allSelected = false;
@ViewChild('myprograms') ProgSel: MatSelect;
toggleAllSelection() {
this.allSelected = !this.allSelected; // to control select-unselect
if (this.allSelected) {
this.ProgSel.options.forEach( (item : MatOption) => item.deselect());
//I changed the above from a select to a deselect since there are too many items in the list.
//The idea is that I clear all of the values, select "All" and will pass that value around
in my code.
} else {
this.ProgSel.options.forEach( (item : MatOption) => {item.deselect()});
}
}
Как выбрать опцию «Все» в файле ts?
Ответ №1:
Несколько шагов для достижения этой цели:
- Поскольку вы используете объекты в качестве своих
mat-option
, используйтеcompareWith
функцию в своемmat-select
, обновленном[(ngModel)]
иmat-option
[value]
привязанном к объектному уровню. - Определите
allOption
структуру, которая будет правильно оценена вашей новойcompareWith
функцией. - Программно
setValue()
перейтиmyprgrmFormControl
к массиву с новымallOption
. Обновите своюvalue
привязку:[value]="allOption"
HTML:
<mat-form-field class="example-full-width">
<mat-label>Select Program(s)</mat-label>
<mat-select #myprograms [formControl]="myprgrmFormControl" multiple [(ngModel)]="criteria" [compareWith]="selectCompare">
<mat-option (click)="toggleAllSelection()" [value]="allOption" >All</mat-option>
<mat-option *ngFor="let row of ProgramDropdown" [value]="row" >
{{row.Program_Name}} </mat-option>
</mat-select>
</mat-form-field>
тс:
allOption = { Program_ID: 'ALL', Program_Name: 'ALL' };
toggleAllSelection() {
this.allSelected = !this.allSelected; // to control select-unselect
if (this.allSelected) {
this.ProgSel.options.forEach((item: MatOption) => item.deselect());
this.myprgrmFormControl.setValue([this.allOption]);
} else {
this.ProgSel.options.forEach((item: MatOption) => {
item.deselect();
});
}
}
selectCompare(item1: SelectType, item2: SelectType) {
return item1.Program_ID === item2.Program_ID;
}
https://stackblitz.com/edit/angular-tqu7nc?file=src/app/select-multiple-example.html