Angular:如何将多个表单控件附加到表单组

S e*_*rds 8 angular angular-forms

我正在使用最新版本的Angular(v6.0.5)。

我有一个由3个通用控件组成的FormGroup,根据某些逻辑,我想将其他多个控件添加到同一FormGroup中。

我知道我可以使用,this.form.addControl()但我不想为每个单独的表单控件执行此操作

是否有捷径可寻?

例:

this.form = this.formBuilder.group({
    'id': new FormControl('', Validators.required),
    'firstName' new FormControl('', Validators.required),
    'lastName' new FormControl('', Validators.required)
});

if (blah) {
    // Append more FormControls here to same FormGroup
    this.form.addControl('houseNumber', new FormControl(''));
    this.form.addControl('street', new FormControl(''));
    this.form.addControl('postCode', new FormControl(''));
}
Run Code Online (Sandbox Code Playgroud)

yur*_*zui 6

由于某种原因,Angular 没有为这种情况提供API

您可以简单地遍历控件并将其添加到FormGroup,也可以基于现有控件构建新的FormGroup:

this.form = this.formBuilder.group({
  'id': new FormControl('', Validators.required),
  'firstName': new FormControl('', Validators.required),
  'lastName': new FormControl('', Validators.required)
});

let blah = true;

if (blah) {
  this.form = this.formBuilder.group({
    ...this.form.controls,
    'houseNumber': new FormControl(''),
    'street': new FormControl('')
  });
} else {
  this.form = this.formBuilder.group({
    ...this.form.controls,
    'otherControl': new FormControl(''),
    'otherControl2': new FormControl(''),
    'otherControl3': new FormControl('')
  });
}
Run Code Online (Sandbox Code Playgroud)

Ng运行示例


Ale*_*nic 4

如果您不想延迟表单创建,您可以简单地执行以下操作:

// You can write this sugar, you don't have to write new FormControl
const form = {
    id: ['', Validators.required],
    firstName: ['', Validators.required],
    lastName: ['', Validators.required]
};

if (blah) {
    form.someField: ['', Validators.required];
} else {
    form.someotherField: ['', Validators.required];
}

this.form = this.formBuilder.group(form);
Run Code Online (Sandbox Code Playgroud)

或者这个较短的内联版本:

this.form = this.formBuilder.group({
    id: ['', Validators.required],
    firstName: ['', Validators.required],
    lastName: ['', Validators.required],
    ...(blah ? {form.someField: ['', Validators.required]} : {form.someotherField: ['', Validators.required]})
});
Run Code Online (Sandbox Code Playgroud)