Чтобы ограничить повторяющийся выбор в компоненте multiselect mat-chip-list, вы можете реализовать следующие методы с примерами кода:
Метод 1: использование набора для отслеживания выбранных значений
Этот метод предполагает использование набора JavaScript для отслеживания выбранных значений и предотвращения дублирования. Вот пример:
<mat-chip-list #chipList>
<mat-chip *ngFor="let option of options" [selectable]="true"
(click)="toggleSelection(option)" [selected]="isSelected(option)">
{{ option }}
</mat-chip>
</mat-chip-list>
import { Component } from '@angular/core';
@Component({
selector: 'app-multiselect',
templateUrl: './multiselect.component.html',
styleUrls: ['./multiselect.component.css']
})
export class MultiselectComponent {
options = ['Option 1', 'Option 2', 'Option 3'];
selectedOptions = new Set<string>();
toggleSelection(option: string) {
if (this.selectedOptions.has(option)) {
this.selectedOptions.delete(option);
} else {
this.selectedOptions.add(option);
}
}
isSelected(option: string): boolean {
return this.selectedOptions.has(option);
}
}
Метод 2: отключение выбранных параметров
В этом методе вы можете отключить выбранные параметры в элементах mat-chip, чтобы предотвратить дублирование выбора. Вот пример:
<mat-chip-list #chipList>
<mat-chip *ngFor="let option of options" [selectable]="true"
(click)="toggleSelection(option)" [selected]="isSelected(option)"
[disabled]="isSelected(option)">
{{ option }}
</mat-chip>
</mat-chip-list>
import { Component } from '@angular/core';
@Component({
selector: 'app-multiselect',
templateUrl: './multiselect.component.html',
styleUrls: ['./multiselect.component.css']
})
export class MultiselectComponent {
options = ['Option 1', 'Option 2', 'Option 3'];
selectedOptions: string[] = [];
toggleSelection(option: string) {
const index = this.selectedOptions.indexOf(option);
if (index > -1) {
this.selectedOptions.splice(index, 1);
} else {
this.selectedOptions.push(option);
}
}
isSelected(option: string): boolean {
return this.selectedOptions.includes(option);
}
}
Метод 3: использование реактивных форм
Если вы используете реактивные формы Angular, вы можете использовать элементы управления формами и валидаторы, чтобы предотвратить дублирование выбора. Вот пример:
<form [formGroup]="multiselectForm">
<mat-chip-list formControlName="selectedOptions">
<mat-chip *ngFor="let option of options" [selectable]="true"
(click)="toggleSelection(option)" [selected]="isSelected(option)">
{{ option }}
</mat-chip>
</mat-chip-list>
</form>
import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
@Component({
selector: 'app-multiselect',
templateUrl: './multiselect.component.html',
styleUrls: ['./multiselect.component.css']
})
export class MultiselectComponent implements OnInit {
options = ['Option 1', 'Option 2', 'Option 3'];
multiselectForm: FormGroup;
constructor(private formBuilder: FormBuilder) {}
ngOnInit() {
this.multiselectForm = this.formBuilder.group({
selectedOptions: [[], Validators.required]
});
}
toggleSelection(option: string) {
const selectedOptions = this.multiselectForm.get('selectedOptions').value;
const index = selectedOptions.indexOf(option);
if (index > -1) {
selectedOptions.splice(index, 1);
} else {
selectedOptions.push(option);
}
this.multiselectForm.get('selectedOptions').setValue(selectedOptions);
}
isSelected(option: string): boolean {
const selectedOptions = this.multiselectForm.get('selectedOptions').value;
return selectedOptions.includes(option);
}
}