Angular中应在constructor还是ngOnInit中实例化Observable?
我应在constructor(构造函数)还是ngOnInit中实例化Observable?
简单说:优先选择在构造函数中实例化Observable,下面给你理清楚原因和适用场景:
为什么选构造函数?
按照Angular的设计惯例,构造函数的核心职责就是初始化类的实例变量,以及处理依赖注入相关的初始化逻辑——不管你的Observable是直接通过new或Observable.of()创建,还是从注入的服务(比如示例里的CoolService)、@ngrx/store的select()方法获取的,都属于实例变量初始化的范畴,放在构造函数里完全符合职责划分。
而且Observable本身是惰性执行的,创建实例并不会触发数据流的订阅或异步操作,所以在构造函数里实例化不会带来性能或生命周期的问题。
那ngOnInit什么时候用?
ngOnInit主要是用来处理组件初始化完成后的逻辑,比如依赖@Input()传入的值来做初始化,或者需要等待视图(比如ViewChild引用)准备好的操作。如果你的Observable创建依赖这些还未在构造阶段就绪的数据,那才需要放到ngOnInit里。
示例代码
@Component({ selector: 'app-my-cool', templateUrl: './my-cool.component.html' }) export class MyCoolComponent implements OnInit { public coolObservable$: Observable<any>; public myItems$: Observable<Item[]>; constructor(private myCoolService: CoolService, private store: Store) { // 推荐在这里实例化Observables this.coolObservable$ = Observable.of('cool!'); // 假设selectItems是你定义的store选择器 this.myItems$ = this.store.select(selectItems); } ngOnInit(): void { // 举个例子:如果依赖@Input()的值创建Observable,就放这里 // 比如:this.dependentObservable$ = this.someService.getData(this.inputValue); } }
总结下:常规场景下,构造函数是实例化Observable的最佳位置;只有当Observable的创建依赖组件初始化阶段才就绪的数据时,才考虑放到ngOnInit中。
内容的提问来源于stack exchange,提问作者Dolan
相关产品推荐
相关产品推荐

