Angular doc here,您可以看到下面的实现方式。即,在formBuilder
中声明constructor()
和服务。我知道在constructor()
内部使用服务是一种不良做法。即我们需要使用ngOnInit()
。但是我也使用constructor()
声明formBuilder
属性。这是太糟糕的做法吗?我是否也需要使用ngOnInit()
?页面创建将一直保持到formBuilder
创建吗?
export class CartComponent {
items;
checkoutForm;
constructor(
private cartService: CartService,
private formBuilder: FormBuilder,
) {
this.items = this.cartService.getItems();
this.checkoutForm = this.formBuilder.group({
name: '',
address: ''
});
}
}
FormBuilder
在FormBuilder
中注入constructor
是推荐的最佳实践,因为Angular使用构造函数注入模式。
FormBuilder
是否在constructor
或ngOnInit
生命周期挂钩中初始化反应形式在很大程度上是优先考虑的问题。但是为了保持代码整洁,将初始化逻辑重构为ngOnInit
(或其他方法)是个好主意。
关于ngOnInit
的时间,文档状态:
[
。实例化指令后,它仅被调用一次。ngOnInit
是一种]回调方法,默认更改检测器首次检查了指令的数据绑定属性,并且在检查了任何视图或内容子级之前,] >因此,将在加载页面视图之前在
ngOnInit
中初始化表单。Reactive Forms的官方Angular文档按如下所示初始化表格:
@Component({
selector: 'app-profile-editor',
templateUrl: './profile-editor.component.html',
styleUrls: ['./profile-editor.component.css']
})
export class ProfileEditorComponent {
profileForm = this.fb.group({
firstName: ['', Validators.required],
lastName: [''],
address: this.fb.group({
street: [''],
city: [''],
state: [''],
zip: ['']
}),
aliases: this.fb.array([
this.fb.control('')
])
});
get aliases() {
return this.profileForm.get('aliases') as FormArray;
}
constructor(private fb: FormBuilder) { }
}