Angular2 patchValue push значение в массив

Это похоже на Angular2's 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 здесь.

4 ответов


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

patchValue (значение: any[], {onlySelf, emitEvent}?: {onlySelf?: логический, эмитевент?: 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


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

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

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


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

this.myForm.controls['array'] = this.formBuilder.array(newArray.map(i => this.formBuilder.group(i)));

Я надеюсь, что это поможет вам. У меня есть сложный объект, где мой объект имеет объект внутри и объект внутри. извините за грамматику. но я надеюсь, что мой код поможет вам

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: ''
    });
  }