角反应式嵌套形式

问题描述 投票:0回答:1

我创建了一个嵌套表单,但奇怪的是,虚拟数据 json 中的参数键由 2 个对象组成,而在实际表单值中,表单数组中只有一个对象。

我找不到任何错误。我不知道发生了什么或导致这种情况发生的原因。

export class App implements OnInit {
  name = 'Angular';
  my_json = {
    machine: {
      idMachine: 'YyWTceUNqsonOvO2ZOLP',
      note: 'accesso con 7u89',
      parameters: [
        {
          description: 'Pompa aria',
          factoryValue: '1676',
          parameter: '7',
        },
        {
          description: 'Cattura ',
          factoryValue: '6589',
          parameter: '5',
        },
      ],
      model: 'AREA',
      serie: 'UIXX7',
      machine: 'T7UID',
    },
    address: 'Via Italia 42',
    phone: '+393295000000',
    email: '[email protected]',
    name: 'Pippo',
    surname: 'Master',
    idUser: 'tt0QAHRD9JFuMETnLvjh',
  };
  public formClient!: FormGroup;

  constructor(public formBuilder: FormBuilder) {
    this.formClient = this.formBuilder.group({
      name: ['', Validators.required],
      surname: ['', Validators.required],
      address: ['', Validators.required],
      email: ['', Validators.required],
      phone: ['', Validators.required],
      machine: this.formBuilder.group({
        serie: [''],
        machine: [''],
        note: [''],
        model: [''],
        idMachine: [''],
        parameters: this.formBuilder.array([
          this.formBuilder.group({
            description: [''],
            factoryValue: [''],
            parameter: [''],
          }),
        ]),
      }),
    });
  }

  ngOnInit() {
    console.log('my data ', this.my_json);
    this.formClient.patchValue(this.my_json);
    console.log('my form values ', this.formClient.value);
  }
}

谢谢。

javascript angular typescript angular-reactive-forms angular2-formbuilder
1个回答
1
投票

.patchValue()
不会为 FormArray 创建 FormGroup/FormControl 实例。

相反,您需要在分配表单值时映射您的

parameters
值。

您也不想在

constructor
中做那项工作。这应该进入生命周期方法,例如
OnInit()
.

无类型 FormGroup 示例:

  form!: FormGroup;

  initParameterForm(parameter?: IParameter): FormGroup {
    return new FormGroup({
      description(parameter?.description || null),
      factoryValue(parameter?.factoryValue || null),
      parameter(parameter?.parameter || null),
    });
  }

  initMachineForm(machine?: IMachine): FormGroup {
    // other fields here
    
    parameters: new FormArray(machine?.parameters?.map(parameter => initParameterForm(parameter)) || []),
  }

  ngOnInit(): void {
    // other code to get machine, if applicable
    this.form = this.initMachineForm(machine);
  }

如果您使用的是 Angular 15,我强烈建议您提供强类型表单。

© www.soinside.com 2019 - 2024. All rights reserved.