【问题标题】:Why observable.subscribe works only from constructor为什么 observable.subscribe 仅适用于构造函数
【发布时间】:2018-08-16 11:55:50
【问题描述】:

在使用 Ionic 3 应用程序时,我遇到了一个问题,当您从 ngOnInit 中的服务订阅 observable 并将局部变量更新到其中时,它不会更新视图。

例如 HTML 模板 <p>{{myVariable}}</p>

constructor(myService: MyService) {
}
ngOnInit() {
  this.myService.myObservable.subscribe((data) => {
    this.myVariable = data;
  });
}

但是当你从构造函数做同样的事情时,它会起作用。

contructor(myService: MyService) {
  this.myService.myObservable.subscribe((data) => {
    this.myVariable = data;
  });
}

它是一个 Ionic 3 应用程序。它包含不同的离子标签。问题是当您订阅ngOnInit 时视图不会自动更新。您可以在选项卡之间切换以使其正常工作。但是当您订阅constructor 时,它无需切换标签即可工作。

知道为什么会这样。任何提示将不胜感激。谢谢。

【问题讨论】:

  • 因为在构造函数中,服务被注入,所以它直接注入服务到组件,在ngOnInit()它没有发生..
  • 你能在stackblitz中展示一个例子吗?没有理由让它在 ngOnInit 中不起作用
  • 如何从服务中发出可观察数据?你能添加那个代码吗?
  • 在 ionicngOnInit 我相信只会被调用一次,最初是在视图导航到时。另一方面,构造函数似乎总是被调用。
  • @alphapilgrim 构造函数并不总是被调用——它是一个构造函数。每个组件实例只调用一次(并且构建在 Angular 生命周期之外)。

标签: angular ionic-framework ionic3 observable


【解决方案1】:

它与 Angular 更改检测有关,有关此的更多信息,请阅读:Angular Change detection

你应该使用 Angular ngZone 服务来解决这个问题,它会更新视图。

import { Component, NgZone } from "@angular/core";

constructor(
    private ngZone: NgZone
    ...
){ }

...
ngOnInit() {
    this.myService.myObservable.subscribe((data) => {
        this.ngZone.run(()  => {
            this.myVariable = data;
        });
    });
}

【讨论】:

  • 好的,谢谢,但它仍然没有回答为什么它在constructor中使用时有效
【解决方案2】:

您没有说明您拥有什么样的可观察对象(例如“冷”、“热”、SubjectBehaviorSubjectHttpClient 可观察对象等)。如果它是您自己创建的可观察对象,则很可能在您通过ngOnInit 方法订阅它之前它的值已更改,因此根据可观察对象的类型,该值会丢失。由于创建 observable 的服务被注入到构造函数中,因此构造函数可以更早地访问服务可能发出的任何值。 如果您自己构建 observable,请考虑使用BehaviorSubject

What is the difference between Subject and BehaviorSubject?

【讨论】:

  • 感谢您的输入,我已经使用了BehaviourSubject 我得到了正确的可观察订阅,但是问题在于角度变化检测,当我在 ngOnInit 中订阅时它会超出角度区域并且无法检测到更改。
【解决方案3】:

使用private myService

contructor(private myService: MyService) {
  this.myService.myObservable.subscribe((data) => {
    this.myVariable = data;
  });
}

【讨论】:

  • 抱歉,我是手动输入的,忘记添加this。我的实际代码包含this
  • 不,它无助于解决我的问题,请重新阅读我的问题。谢谢。
猜你喜欢
  • 1970-01-01
  • 2016-02-17
  • 2011-10-18
  • 2020-01-14
  • 2016-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-21
相关资源
最近更新 更多