具有反应形式的组件的最佳实践是什么?

时间:2018-07-14 11:27:54

标签: angular angular-reactive-forms

我正在努力确定定义使用反应形式的组件的最佳实践是什么。

例如,Reactive Forms docs给出了类似的示例:

1)

export class HeroDetailComponent2 {
  heroForm = new FormGroup ({
    name: new FormControl()
  });
}

2)

export class HeroDetailComponent3 {
   heroForm: FormGroup; // <--- heroForm is of type FormGroup 

   constructor(private fb: FormBuilder) { // <--- inject FormBuilder
     this.createForm();
   }

   createForm() {
     this.heroForm = this.fb.group({
       name: '', // <--- the FormControl called "name"
     });
   }
}

显然, 1 的问题在于我们无权访问组件的属性,因此可以设置初始值。我们看到的更好的方法是在选项 2 中。

但是我也已经在文档中读到了(目前无法找到链接),应该避免将逻辑放入组件的构造函数中,而应该使用ngOnInit(),因为它使测试更容易且性能更高。

我遵循这种做法,即尽可能将组件初始化逻辑放在ngOnInit()中。但是,当我有一个引用formGroup属性的组件时,就会遇到问题。

出现问题是因为在ngOnInit执行之前就已渲染视图,因此此时我的表单组未实例化。解决此问题的一种方法是在各个地方使用* ngIf-但这对我来说似乎很混乱。

所以我的问题:

在这种情况下,不建议不要将逻辑放在构造函数中而建议使用ngOnInit是否明智?在某些情况下,我可能需要做一些计算才能生成formGroup实例?

我似乎找不到适合的替代生命周期挂钩?还有另一种方法吗?

1 个答案:

答案 0 :(得分:0)

我建议您使用角度生命周期挂钩,并在ngOnInit()上创建反应形式

export class HeroDetailComponent3 implements OnInit {
   heroForm: FormGroup; // <--- heroForm is of type FormGroup 

   constructor(private fb: FormBuilder) { // <--- inject FormBuilder

   }

   ngOnInit(){
      this.createForm();
   }

   createForm() {
     this.heroForm = this.fb.group({
       name: new FormControl('', [Validators.required])
     });
   }
}