我在Angular中遇到了很多带有subscribe方法的代码,如果不使用它们,我们将会失去什么?
为什么所有使用订阅的代码都是用构造函数而不是ngOnInit编写的?
constructor(private router: Router) {
m_Router.events.filter(event => event instanceof XComponent)
.subscribe(e => {
...
});
}
答案 0 :(得分:0)
Angular的大多数功能都是基于可观察的,允许异步执行代码。如果您不订阅m_Router.events
之类的属性,它将永远不会返回任何值。由于可观察对象需要某种订阅。
通常我建议将在组件加载时需要发生的所有逻辑放在ngOnInit方法中。由于构造函数通常用于诸如依赖注入之类的东西。这篇文章对此进行了更详细的说明:Difference between Constructor and ngOnInit
关于订阅者和订阅的另一个说明是,当组件卸载时,您应该手动取消订阅。 Angular在使用HttpClient时会注意这一点,但对于其他订阅,例如m_Router.events
,则应使用ngOnDestroy取消订阅。为此,您应在订阅者时将订阅者存储在变量中。
答案 1 :(得分:0)
订阅服务的最佳实践是 ngOnInit()lifeCycle挂钩方法,
您可以在有关角度服务的官方文档中阅读以下内容:示例getHeroes
服务:
在ngOnInit中调用 虽然可以在构造函数中调用getHeroes(),但这不是最佳实践。
保留构造函数以进行简单的初始化,例如将构造函数参数连接到属性。构造函数不应该做任何事情。当然,不应像真正的数据服务那样调用向远程服务器发出HTTP请求的函数。
相反,请在ngOnInit生命周期挂钩内调用getHeroes(),并在构造HeroesComponent实例后的适当时间让Angular调用ngOnInit。
ngOnInit() {
this.getHeroes();
}