Вы можете сохранить langs в массиве, сделав такую функцию, как
lang = []; //define the array
getLang(i, languageList) {
return i == 0 ? languageList :
this.getLang(i - 1, languageList.filter(x => x.name != this.lang[i-1]))
}
Итак, вы можете иметь что-то вроде
<div *ngFor="let a of languageList;let i=index">
<select [(ngModel)]="lang[i]">
<option value="undefined" disabled>Select Language</option>
<option *ngFor="let lang of getLang(i,languageList)"
[value]="lang.name" >{{lang.name}}</option>
</select>
</div>
Но мне не нравится, потому что каждая сила измененияУгловой для расчета всех вариантов.Итак, мы собираемся улучшить код с помощью FormArray и массива langList и убедиться, что мы не можем выбрать один и тот же язык
Сначала наша переменная и наша функция изменились
langList=[];
getLangForFormArray(i, languageList) {
return i == 0 ? languageList :
this.getLang(i - 1, this.langList[i-1].filter(x => x.name != this.formArray.value[i-1]))
}
Мы создаемa formArray
formArray=new FormArray(this.languageList.map(()=>new FormControl(null)))
И в ngOnInit
ngOnInit()
{
this.formArray.valueChanges.pipe(startWith(null)).subscribe(()=>{
//create the langList array
for (let i=0;i<this.languageList.length;i++)
this.langList[i]=this.getLangForFormArray(i,this.languageList)
//check no repeat values
if (value)
{
value.forEach((x,index)=>{
if (this.formArray.value.findIndex(v=>v==x)!=index)
this.formArray.at(index).setValue(null,{emitEvent:false})
})
}
})
}
Смотрите, что используйте formArray valueChanges с pipe (startWith (null)), чтобы сначала создать langList
The.html
<div *ngFor="let control of formArray.controls;let i=index">
<select [formControl]="control">
<option value="null" disabled>Select Language</option>
<option *ngFor="let lang of langList[i]"
[value]="lang.name" >{{lang.name}}</option>
</select>
</div>
И демоверсия в stackblitz