Я заметил, что когда я удаляю элемент из моего FormArray
, он всегда удаляет первую запись, а не передаваемый в нее индекс. Даже более странно, когда я console.log передаю значение в мою функцию, которая должна иметь тип number
, я получаю целый FormControl
объект, который я не могу понять, как и почему это происходит.
В целом Я создаю синтаксический анализатор SVG и работаю над формой, которую пользователь может редактировать или модифицировать перед сохранением в базу данных после того, как SVG был проанализирован и преобразован в объект данных. Я хочу, чтобы пользователь мог добавлять или удалять поля для атрибутов и стилей, поэтому у меня есть механизм, который выглядит следующим образом
AttributeListComponent.ts
export class AttributeListComponent implements OnInit {
@Input() AttributeListData: FormArray;
constructor() { }
ngOnInit() {
//this.showData();
}
showData(){ console.log(this.AttributeListData); }
addAttribute(): void{
const newAttribute: FormGroup = CreateAttributeForm();
let attrList: FormArray = <FormArray>this.AttributeListData as FormArray;
//console.log(newAttribute);
attrList.push(newAttribute);
//this.showData();
}
deleteAttribute(item: number): void{
let attrList:FormArray = this.AttributeListData as FormArray;
console.log(item);
attrList.removeAt(item);
//this.AttributeListData.removeAt(item);
}
}
AttributeListComponent. html
<section>
<article *ngIf="!AttributeListData">
<p>loading</p>
</article>
<article *ngIf="AttributeListData">
<h5 *ngIf="AttributeListData.controls.length === 0">no attributes</h5>
<section *ngIf="AttributeListData.controls.length > 0">
<article *ngFor="let item of AttributeListData.controls; let i of index">
<attribute-form-component [AttributeFormData]="item"></attribute-form-component>
<button (click)="deleteAttribute(i)">delete</button>
</article>
</section>
</article>
<article>
<button (click)="addAttribute()">add</button>
</article>
</section>
AttributeFormComponent.ts
export class AttributeFormComponent implements OnInit {
@Input() AttributeFormData: FormGroup;
constructor() { }
ngOnInit() {
}
}
AttrbuteFormComponent. html
<article>
<label for="attribute">
<input
type="text"
name="attribute"
id="attribute"
[value]="AttributeFormData.controls.attribute.value[0]"
formControlName="attribute"
/>
</label>
<label for="setting">
<input
type="text"
name="setting"
id="setting"
[value]="AttributeFormData.controls.setting.value[0]"
formControlName="setting"
/>
</label>
</article>
Видя, что общий механизм настолько динамичен c по своей природе я решил создать отдельные функции для создания различных частей формы - вот что входит в игру CreateAttributeForm()
в AttributeListComponent
, которая выглядит следующим образом.
CreateAttributeForm
export function CreateAttributeForm(data?: OvaadGraphicAttribute): FormGroup{
return new FormGroup({
attribute: new FormControl([(data ? data.attribute : ''), Validators.required]),
setting: new FormControl([(data ? data.setting : ''), Validators.required])
}) as FormGroup;
}
Теперь, если мы посмотрим на мою deleteAttribute()
функцию ниже, console.log()
каким-то образом возвращает целый FormGroup
объект.
deleteAttribute(item: number): void{
let attrList:FormArray = this.AttributeListData as FormArray;
console.log(item);
attrList.removeAt(item);
//this.AttributeListData.removeAt(item);
}
Я даже изменил его на console.log(item.controls)
, и хотя VSCode выдал свою собственную внутреннюю ошибку, сообщая мне
Свойство 'controls' не существует для типа 'number'.ts (2339) * 105 7 *
он все еще отключил элементы управления для FormGroup, поэтому я действительно не понимаю, как и почему это происходит, особенно с item:number
, и при этом не выдает ошибку типа. Кто-нибудь может определить, что я делаю не так? Я не удосужился использовать ControlValueAccessor
или что-то еще для обновления значений в родительской форме, и мне было интересно, может быть, это как-то связано с этим, потому что я, честно говоря, не могу найти что-то, указывающее на что-то еще, что нам нужно сделать для того, чтобы удалить нужный элемент. Все просто показывает let i of index
и ourDeleteItemFunction(i)
как событие щелчка.