У меня есть уникальное требование для списка переключения.
По умолчанию все (4) переключатели имеют значение true. При выборе одного переключателя я хочу, чтобы все остальные переключатели были установлены в значение false, в то время как выбранный переключатель имеет значение true.
Затем я хочу иметь возможность выбрать другие переключатели, которые будут иметь значение true для «добавления».
Мой код выглядит следующим образом:
HTML
<mat-list class="list lt-checkbox" [ngClass]="{'selected-all': allTogglesSelected()}">
<mat-list-item>
<app-icon-switch class="toggle-all" text="All Sydney" [subText]="" icon=""
(checkedChange)="onAllChange($event)" [checked]="allTogglesSelected()">
</app-icon-switch>
</mat-list-item>
<mat-list-item>
<mat-checkbox [checked]="getFilterValue('Toggle_one')" (change)="onToggleChange('Toggle_one', $event)" color="primary"
class="toggle">Toggle 1
</mat-checkbox>
</mat-list-item>
<mat-list-item>
<mat-checkbox [checked]="getFilterValue('Toggle_two')" (change)="onToggleChange('Toggle_two', $event)"
color="primary" class="toggle">Toggle 2
</mat-checkbox>
</mat-list-item>
<mat-list-item>
<mat-checkbox [checked]="getFilterValue('Toggle_three')" (change)="onToggleChange('Toggle_three', $event)"
color="primary" class="toggle">Toggle 3
</mat-checkbox>
</mat-list-item>
<mat-list-item>
<mat-checkbox [checked]="getFilterValue('Toggle_four')" (change)="onToggleChange('Toggle_four', $event)" color="primary"
class="toggle">Toggle 4
</mat-checkbox>
</mat-list-item>
Переключить TS
private toggleRegions = ['Toggle_one', 'Toggle_two', 'Toggle_three', 'Toggle_four'];
onToggleChange(toggleState: string, value: any) {
this.toggleFilters[toggleState] = value.checked;
this.saveInStore();
}
onAllChange(value: boolean) {
const hasChanged = this.toggleRegions.some(r => this.toggleFilters[r] !== value);
if (hasChanged) {
this.toggleRegions.forEach(r => (this.toggleFilters[r] = value));
this.saveInStore();
}
}
saveInStore() {
this.store.dispatch(UpdateToggleFilter({ toggleFilters: this.toggleFilters }));
}
getFilterValue(filter: string): boolean {
return this.toggleFilters[filter];
}
allSydneySelected(): boolean {
return this.toggleRegions.findIndex(r => !this.toggleFilters[r]) === -1;
}
Мне пришлось изменить некоторые имена из соображений конфиденциальности. По сути, в настоящее время он работает, так как нажатие на тумблер отменит его и оставит остальные выделенными, я хочу наоборот.