#angular
#angular
Вопрос:
У меня есть страница, на которой появляется выпадающий список элементов. Список представляет собой массив объектов. Я хочу удалить этот объект из списка, который был выбран ранее. component.html
<select (change)="onChange($event.target.value)" type="number"
class="form-control" formControlName="Id" >
<option hidden value="" >Please Select Item</option>
<option *ngFor="let name of getItems" type="number" [ngValue]="name.Id">
{ name.ItemName }}
</option>
</select>
мой файл component.ts
ngOnInit(){
this.service
.getItemListByRule(this.Id)
.subscribe((res: any) => {
this.getItems = res.payload;
});
}
onChange(value) {
this.getItems.splice(this.getItems.findIndex(item => item.Id === value), 1);
console.log(this.getItem)
}
Я использую метод splice для удаления выбранного элемента из списка массива. Но он работает не так, как ожидалось.
Комментарии:
1. не могли бы вы поделиться своим кодом на любой платформе, например (jsfiddle или codepen и т. Д.), Чтобы можно было взглянуть на него и отладить его?
2. Я бы не стал использовать splice. Используйте фильтр, чтобы удалить выбранный элемент и вернуть оставшуюся часть списка.
Ответ №1:
Если вы хотите не показывать, но можете быть выбраны, вам нужно присвоить значение hidden, например
<form [formGroup]="form">
<select type="number"
class="form-control" formControlName="Id" >
<option hidden value="null" >Please Select Item</option>
<option *ngFor="let name of items"
<!--just simple hidden if is the value select
be carefull!, is not equal use "null" to not add the attrib hidden-->
[hidden]="form.get('Id').value==name.Id?true:null"
type="number" [ngValue]="name.Id">
{{ name.ItemName }}
</option>
</select>
</form>
См. stackblitz
Обновите, если у нас есть FormArray
FormArray может быть FormArray FormControls
form = new FormGroup({
array: new FormArray([new FormControl(null), new FormControl(null)])
});
Или FormArray из FormGroups
form = new FormGroup({
array: new FormArray([
new FormGroup({
id:new FormControl()
}),
new FormGroup({
id:new FormControl()
}),
])
});
В любом случае вам нужно, как обычно, когда mannage a FormArray a getter
get array() {
return this.form.get("array") as FormArray;
}
Если это FormArray FormControls, вы используете [hidden]="array.at(i).value==name.Id?true:null"
<form [formGroup]="form">
<div formArrayName="array">
<div *ngFor="let control of array.controls;let i=index">
<select type="number"
class="form-control" [formControlName]="i" >
<option hidden value="null" >Please Select Item</option>
<option *ngFor="let name of items"
[hidden]="array.at(i).value==name.Id?true:null"
type="number" [ngValue]="name.Id">
{{ name.ItemName }}
</option>
</select>
</div>
</div>
</form>
Если вы используете FormArray из FormGroups, используйте [hidden]="array.at(i).value.Id==name.Id?true:null"
<form [formGroup]="form">
<div formArrayName="array">
<div *ngFor="let control of array.controls;let i=index" [formGroupName]="i">
<select type="number"
class="form-control" formControlName="Id" >
<option hidden value="null" >Please Select Item</option>
<option *ngFor="let name of items"
[hidden]="array.at(i).value.Id==name.Id?true:null"
type="number" [ngValue]="name.Id">
{{ name.ItemName }}
</option>
</select>
</div>
</div>
</form>
ПРИМЕЧАНИЕ: stackblitz обновляется с тремя случаями
Комментарии:
1. @neelam, я просто обновляю ответ и stackblitz (учитывается только то, как «спросить» об элементе управления. if — это FormArray FormControls
array.at(i).value
if — это FormArray FormGroupsarray.at(i).value.Id
2. что, если у нас есть массив формы, как в приведенной ниже ссылке stackblitz. stackblitz.com/edit /…
3. @neelam У меня аналогичная проблема с массивом форм. Array.filter не подходит, поскольку он изменяет фактический массив. Если вы исправили, не могли бы вы помочь
Ответ №2:
Демонстрация Прежде всего, вы забыли снова сопоставить свой результат с вашим массивом
измените параметры на
<option *ngFor="let name of getItems" type="number" value="{{name.Id}}">
{{ name.ItemName }}
</option>
и в методе изменения, соответствующем вашему массиву
onChange(value) {
this.getItems=this.getItems.filter(x=>x.Id!=value)
}
Комментарии:
1. он работает. но я не могу увидеть выбранную опцию в поле ввода.
2. @neelam, вам нужно пометить как «скрытый», а не фильтровать список элементов