Есть несколько способов сделать это ... например, одним из способов было бы разделить массивы на два и разделить значения из второго массива, когда в первом mat-select
.
выбрана опция.
- Вы также можете просто отключить параметры во втором списке при выборе в первом
mat-select
... это будет сценарий, который я буду использовать в этом примере.
Создатьпеременная компонента для хранения выборок из первых mat-select
firstSelections: string = '';
Создать метод для установки первых значений выбора внутри этой переменной
setFirstValues(values) {
this.firstSelections = values;
}
Затем вызвать этот метод при изменении выбора из первой mat-select
и передайте значения.
<mat-select #select1 placeholder="Select Year/Week" class="DropDownYear" multiple (selectionChange)="setFirstValues($event.value)">
Затем во втором mat-select
при определении параметров используйте привязку свойства к disabled
, чтобы проверить, включена ли опция в переменную firstSelections
, чтобы отключить эту опцию во второмсписок, если выбран в первом.
<mat-option *ngFor="let time2 of resYearData.time" [value]="time2" [disabled]="firstSelections.includes(time2)">{{time2}}</mat-option>
Stackblitz
https://stackblitz.com/edit/angular-rc5vwq?embed=1&file=app/select-overview-example.html
Если вам требуется физическое удаление опцийот Во втором списке вам нужно изучить разбиение resYearData
на два отдельных массива для каждого выбора mat ... и затем удалить значения из второго массива при выборе первого mat-select
.
- Концепция будет такой же, но вместо того, чтобы назначать выбор переменной для сравнения при отключении, вы просто удалите значения из второго массива в методе
setFirstValues()
.
В соответствии с комментарием, сделанным ниже malbarmawi
Я исправил стек-блиц, чтобы устранить проблему, если кто-то сначала выбирает второй список, удаляя выбор из второго списка, а затем отключая.
Оберните HTML в шаблонно-управляемую форму, вы можете называть его как угодно, в этом примере я просто называю это myForm
<form #myForm="ngForm">
Передайте форму вашему методу на selectionChange
(selectionChange)="setFirstValues(myForm)"
Назначение имени и ngModel для каждого из mat-selects
name="select1" ngModel
Получение ссылки на второй выбор с помощью ViewChild
@ViewChild('select2') _select2: any
Установка первых значений выборапри изменении и соединении значений из второго списка, если он присутствует и отмените выбор.
setFirstValues(form) {
this.firstSelections = form.value.select1
const secondSelectionsValues = this._select2.value.slice();
for (var i = 0; i < secondSelectionsValues.length; i++) {
if (this.firstSelections.includes(secondSelectionsValues[i])) {
secondSelectionsValues.splice(i, 1)
this._select2.writeValue(secondSelectionsValues);
}
}
}
Редакция
Добавить проверку на ноль, чтобы предотвратить запуск логики, если this._select2.value
нет.
setFirstValues(form) {
this.firstSelections = form.value.select1
if (this._select2.value) {
const secondSelectionsValues = this._select2.value.slice();
for (var i = secondSelectionsValues.length - 1; i >= 0; i--) {
if (this.firstSelections.includes(secondSelectionsValues[i])) {
secondSelectionsValues.splice(i, 1)
this._select2.writeValue(secondSelectionsValues);
}
}
}
}