在角
相互排斥的选项让我试着解释一下我的情况......在角
我有一个<form>
包含一个FormArray
。每个FormArray
组拥有“食品”control
,并且它们每个都是<select>
。
所有的选择由单个array
填充。
我想要实现的是:
每个选择的选项必须选择专门...换句话说, 结果在FormArray
只能包含独特元素。
我的实际代码:
HTML:
<form [formGroup]="formGroup">
<div>
<button type="button"
md-raised-button
color="primary"
(click)="addItem()">
<md-icon>add</md-icon>
Add food
</button>
</div>
<ng-container formArrayName="items" *ngFor="let item of formArray.controls; index as i">
<md-card>
<md-card-title>
<h3>Item nº {{ i + 1 }}</h3>
<button type="button" md-mini-fab color="warn" mdTooltip="Remove" (click)="removeItem(i)">
<md-icon>delete</md-icon>
</button>
</md-card-title>
<md-card-content [formGroupName]="i">
<md-select placeholder="Favorite food" formControlName="food" name="food">
<md-option *ngFor="let food of foods" [value]="food.value">
{{food.viewValue}}
</md-option>
</md-select>
</md-card-content>
</md-card>
</ng-container>
</form>
组件:
formGroup: FormGroup;
formArray: formArray;
ngOnInit() {
this.formArray = this.formBuilder.array([]);
this.formGroup = this.formBuilder.group({
items: this.formArray
});
}
addItem() {
this.formArray.push(
this.formBuilder.group({
food: ''
})
)
}
removeItem(index: number) {
this.formArray.removeAt(index);
}
我想知道哪个是实现这一目标的最佳选择。
到目前为止,我认为在3个选项:
1 - 这已在另一<select>
选择禁用选项;
2 - 创建一个自定义验证程序并告诉用户他无法在2个或更多选择中选择一个选项。
3 - 完全删除选中的其他选项。
我更喜欢1st。选项,但是我找不到办法做到这一点。有人能告诉我一些启动吗?我希望这个问题很清楚。
这是plunker。
刚刚建立我自己的解决方案:
我创建了一个方法来检查它是否应该禁用:
isDisabled(value: number, index: number): boolean {
const foundIndex = this.formArray.value.findIndex(val => val.food === value);
return foundIndex !== -1 && foundIndex !== index;
}
所以,在模板...
...
<md-option *ngFor="let food of foods"
[value]="food.value"
[disabled]="isDisabled(food.value, i)">
...
是不是最佳的解决方案?也许......如果你有另一个选择来做到这一点,让我知道。
这可以通过订阅控制的valueChanges
订阅内部来实现,
this.formGroup.controls['items'].valueChanges.subscribe(
d=>{
_.remove(this.foods,(item)=>{return item=== d[0].food})
})
,从数组中删除的元素。
关于删除,再次推对象数组如下,
removeItem(index: number) {
this.foods.push(this.formArray.controls[index].controls["food"].value);
this.formArray.removeAt(index);
}
感谢您的回答,但它不起作用。每当您选择一个选项时,它将从当前选择中删除,因此您有一个空白选择。只需看看你的潜水员。 –
@ dev_054你能清楚地解释我的代码中的差距吗? – Aravind
我发现这个(相当古老)用'jQuery'编写:http://rndnext.blogspot.com.br/2009/08/mutually-exclusive-html-select-elements.html。 –