2016-12-01 2 views
7

Это похоже, что Angular2's FormGroup.patchValue() не вставляет новые элементы в массив.Angular2 patchValue значение push в массив

Например что-то вроде этого:

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 here.

ответ

4

.patchValue() только обновляет существующий FormArray, он не изменит структуру вашей модели формы.

patchValue (значение: любая [], {onlySelf, emitEvent} ?: {onlySelf ?: булев, emitEvent ?: булева}): недействительные заплаты Значения 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

+1

Как можно узнать, сколько форма управления толкать вперед? – kostia

+0

Хороший вопрос @ kostia. Не могли бы вы это понять? – MeMeMax

8

Ну, как сказал silentsod, это не представляется возможным. В настоящее время я использую ниже в качестве альтернативы:

 let controlArray = <FormArray>this.form.controls['apps'];   
     this.list.forEach(app => { 
        const fb = this.buildGroup(); 
        fb.patchValue(app); 
        controlArray.push(fb); 
      }); 

Угловое Team - Нам нужна новая функция что-то вроде PatchArray(), который будет залатать из коллекции/графа объектов. Это основной вариант использования.

-1

Ну, решение, которое я узнал, это:

this.myForm.controls['array'] = this.formBuilder.array(newArray.map(i => this.formBuilder.group(i))); 
Смежные вопросы