Angular2 Значение значения параметра patchValue в массиве
Похоже, что Angular2 FormGroup.patchValue() не вставляет новые элементы в массив.
Например, что-то вроде этого:
ngOnInit() {
this.form = this.formBuilder.group({
animal: [''],
school: this.formBuilder.group({
name: [''],
}),
students: this.formBuilder.array([this.formBuilder.control('Bob')])
});
setTimeout(() => this.form.patchValue({
animal: 'cat'
school : {name: 'Fraser'},
students: ['Bob gets edited', 'This will not show']
}), 250);
}
Будет только обновить первый элемент в "учениках", но не будет вставить второй элемент.
Что мне нужно сделать, чтобы отобразить оба элемента?
Plunker здесь.
Ответы
Ответ 1
.patchValue()
только обновляет существующий FormArray
, он не изменит структуру вашей модели формы.
patchValue (value: any [], {onlySelf, emitEvent}?: {onlySelf?: boolean, emitEvent?: boolean}): void Исправляет значение FormArray. Он принимает массив, который соответствует структуре элемента управления, и сделает все возможное, чтобы сопоставить значения с правильными элементами управления в группе.
Он принимает как супер-наборы, так и подмножества массива без выдачи ошибки.
Вам действительно нужно вставить новый элемент в массив, чтобы он появился.
this.form.controls['students'].push(new FormControl('This will not show'));
Все это в документации FormArray
https://angular.io/docs/ts/latest/api/forms/index/FormArray-class.html
Ответ 2
Ну, как сказал силенсод, это невозможно. В настоящее время я использую ниже в качестве альтернативы:
let controlArray = <FormArray>this.form.controls['apps'];
this.list.forEach(app => {
const fb = this.buildGroup();
fb.patchValue(app);
controlArray.push(fb);
});
Angular Команда. Нам нужна новая функция, например PatchArray(), которая будет паттировать из графа коллекции/объекта. Это основной вариант использования.
Ответ 3
Ну, решение, которое я выяснил, это:
this.myForm.controls['array'] = this.formBuilder.array(newArray.map(i => this.formBuilder.group(i)));
Ответ 4
Я надеюсь, что это поможет вам. У меня есть сложный объект, где у моего объекта есть объект внутри и объект внутри. извините за мою грамматику. но я надеюсь, что мой код поможет вам
ngOnInit() {
this.descriptifForm = this._fb.group({
name: 'ad',
descriptifs: this._fb.array([ this.buildForm() ]),
});
this._service.getData().subscribe(res => {
this.descriptifForm.setControl('descriptifs', this._fb.array(res || []));
});
}
buildA(): FormGroup {
return this._fb.group({
Id: '',
Groups: this._fb.array([ this.buildB() ]),
Title: ''
});
}
buildB(): FormGroup {
return this._fb.group({
Id: '',
Fields: this._fb.array([ this.bbuildC() ]),
Type: ''
});
}
buildC(): FormGroup {
return this._fb.group({
Answers: this._fb.array([ this.buildD() ]),
Code: '',
});
}
buildD(): FormGroup {
return this._fb.group({
Data: ''
});
}