Как ограничить выбор дубликатов в Mat-Chip-List Multiselect в Angular

Чтобы ограничить повторяющийся выбор в компоненте 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);
  }
}