在Angular中,订阅和订阅的目的是什么?我们应该在哪里使用in(构造函数或ngOnInit)?

时间:2019-05-24 15:52:52

标签: angular typescript

我在Angular中遇到了很多带有subscribe方法的代码,如果不使用它们,我们将会失去什么?

为什么所有使用订阅的代码都是用构造函数而不是ngOnInit编写的?

constructor(private router: Router) {
  m_Router.events.filter(event => event instanceof XComponent)
    .subscribe(e => {
      ...
    });
}

2 个答案:

答案 0 :(得分:0)

Angular的大多数功能都是基于可观察的,允许异步执行代码。如果您不订阅m_Router.events之类的属性,它将永远不会返回任何值。由于可观察对象需要某种订阅。

通常我建议将在组件加载时需要发生的所有逻辑放在ngOnInit方法中。由于构造函数通常用于诸如依赖注入之类的东西。这篇文章对此进行了更详细的说明:Difference between Constructor and ngOnInit

关于订阅者和订阅的另一个说明是,当组件卸载时,您应该手动取消订阅。 Angular在使用HttpClient时会注意这一点,但对于其他订阅,例如m_Router.events,则应使用ngOnDestroy取消订阅。为此,您应在订阅者时将订阅者存储在变量中。

答案 1 :(得分:0)

  

订阅服务的最佳实践是 ngOnInit()lifeCycle挂钩方法

您可以在有关角度服务的官方文档中阅读以下内容:示例getHeroes服务:

Tutorial about services

在ngOnInit中调用    虽然可以在构造函数中调用getHeroes(),但这不是最佳实践。

保留构造函数以进行简单的初始化,例如将构造函数参数连接到属性。构造函数不应该做任何事情。当然,不应像真正的数据服务那样调用向远程服务器发出HTTP请求的函数。

相反,请在ngOnInit生命周期挂钩内调用getHeroes(),并在构造HeroesComponent实例后的适当时间让Angular调用ngOnInit。

ngOnInit() {
  this.getHeroes();
}