У нас есть форма, которая принимает ответ службы, чтобы заполнить таблицу (наш FormArray) правильными именами полей. Учитывая правильные имена полей формы, мы пытаемся заполнить поля для некоторых параметров другим вызовом службы другой базе данных.Angular2 Formbuilder - Ссылка на элемент FormArray
Простой пример:
ngOnInit() {
this.myForm = this._fb.group({
name: [''],
myArray: this._fb.array([])
}),
initArray();
}
private initArray(){
this.arrayValsService.getValues.subscribe(
response => {
for (item of response) {
let arrayItemGroup = this.createItemGroup(item.code, item.value);
const control = <FormArray>this.myForm.controls['myArray'];
control.push(arrayItemGroup);
}
},
err => {console.error(err);}
};
}
private createItemGroup(code: string, value: string) {
return this._fb_group({
selected: [false],
itemCode: [code],
itemValue: [value],
otherVal1: [''],
otherVal2: ['']
});
}
private setArray() {
if(this.key !== undefined) {
this.dataService.getData(this.key).subscribe(
response => {
this.myForm.patchValue(response);
for (let resItem of response.itemsSet) {
for (let formItem of <FormArray>this.myForm.controls['myArray']) {
if (formItem.controls.itemCode === resItem.code) { // <== ISSUE HERE
formItem.patchValue(response.itemsSet.resItem);
formItem.controls.selected.setValue(true);
}
}
}
err => {console.error(err);}
);
}
}
Я получаю сообщение об ошибке в консоли, что «не может прочитать свойство„контролирует“неопределенных» происходит на отмеченной линии выше. Мне нужно ссылаться на отдельные группы управления формой внутри массива, чтобы соответствующим образом обновлять их значения. Вместо того чтобы использовать вложенный цикл, я также пытался использовать array.find для того, чтобы проверить конкретный элемент управления в пределах группы элементов массива:
const control = <FormArray>(this.myForm.controls['myArray'])
.find(item => myArray.controls.item.itemCode === resItem.code)
Это также не работает; сталкиваясь с той же проблемой, когда элементы управления являются свойством неопределенного. Суть в том, что мне нужен способ ссылки на дочерние элементы formArray и элементы управления каждого из этих детей.
Ниже метод работает для перебора объекта formArray.controls массива, но по-прежнему производит машинописный ошибка компиляцию:
for (let resItem of response.itemsSet) {
const control = this.myForm.controls['myArray'].controls
.find((item:any) => item.value.itemCode === resItem.code);
if(control) {control.controls.selected.setValue(true); // ...other value updates
control
является массив объектов, так .find() работает здесь. Внутри детей (типа FormGroup) ['myArray'].controls
есть еще один объект массива, child.value, у которого есть код, с которым я сравниваю ответ службы. Функционально это выполняет намеченную работу; однако, я все еще получаю сообщение об ошибке: «Ошибка TS2329: Property 'controls' не существует в типе 'AbstractControl'. '
Final редактирования для дальнейшего использования:
типажей самого FormArray и FormGroup я «находить» было эффективно при удалении начальных ошибок машинописи. Тем не менее, после этого, элементы управления формы, которые я обновлял, начали бросать один и тот же «элемент управления» на тип «AbstractControl». Я изменил формат для ссылки на конкретный элемент управления на основе this question.
Окончательный результат:
for (let resItem of response.itemsSet) {
const control = (<FormGroup>((<FormArray>(this.myForm.controls['myArray'])).controls
.find((item:any) => item.value.itemCode === resItem.code)));
if(control) {control.controls['selected']setValue(true); // ...other value updates
Основные тезисы: FormGroups, приведения типов FormArrays; ссылаясь на явно названные элементы управления в формате ['control'].
После этой модели привел меня к паре Т.С. ошибок: Тип «FormArray» не является массив или строка; свойство 'controls' не существует в типе 'AbstractControl'. В вашем plnkr вы не использовали '['myArray']. Controls' как' '(и я считаю, что это массив типов). Я удалил это кастинг, но все равно получаю ошибку по типу AbstractControl, и метод не дает ожидаемых результатов. Я отредактирую вопрос с помощью метода, который является функционально адекватным, но все же произведет ту же ошибку. –
Вы пробовали кастинг? Если вы знаете лучше, чем компилятор, вам придется это рассказать. Обновлен ответ, чтобы предоставить примеры. – silentsod