从Observable的订阅中获取更新的值

时间:2016-11-03 09:45:37

标签: angular observable

我注意到有关Angular 2中的Observables的一些内容,我无法解释,并希望一个好的模型能够揭示我。

我的理解是,在订阅Observable时,你基本上有两种策略来消耗它发出的值:

流与异步管道相结合,如:

myTextSubscription$ = SomeObservable.subscribe();

{{ myTextSubscription$ | async }}

或提取值并从订阅处理程序中绑定它:

myTextSubscription$ = SomeObservable.subscribe(text => this.text = text);

{{ text }}

嗯,问题是我已经尝试了几次使用后一种方法,我从未设法更新text值,除非我在处理程序中调用this.cdRef.markForCheck()。我猜这种基本场景不应该需要手动调用changeDetection - 至少我没有看到在任何截屏或教程中使用过。

这听起来对任何人都很熟悉吗?这是我对该方法的错误理解,还是它可能是Angular 2中的一个错误?

编辑:

上面的代码已被抽象,因为我认为问题可以在更抽象的层面上解释。

我不记得第一个案例,当它咬我,但现在Observable来自ngrx商店,所以它基本上是这样的:

this.text$ = store.let((state$: Observable<State>) => {
  return state$.select(state => state.text);
});

2 个答案:

答案 0 :(得分:1)

如果SomeObservable以某种方式在Angulars区域之外初始化或使用某些未被zone.js隐藏的API,通常会发生这种情况。

我们需要了解SomeObservable如何确切构造才能确定。

答案 1 :(得分:1)

事实上,在使用qsort时,您不应该订阅observable。 这就是qsort令人敬畏的原因。当您的组件被初始化/销毁时,它会处理asyncasync

所以代替:
JS

subscribe

HTML

unsubscribe

你应该宁愿:
JS

myTextSubscription$ = SomeObservable.subscribe();

HTML

{{ myTextSubscription$ | async }}

我想在您的变量名称中澄清$的使用:
  - 观察结果应以&#39; $&#39;为后缀   - 当你使用订阅时,你没有得到可观察的

关于惯例:
JS

myTextSubscription$ = SomeObservable;

HTML

{{ myTextSubscription$ | async }}

请记住:
- 当您使用订阅时,您需要从observable取消订阅 ,但路由器和http除外) - 如果您有let someObservable$ = ...; ,则返回的值为{{ someObservable$ | async }} 类型(这意味着您可以取消订阅)

所以这里是一个更清洁的结构概述(不使用异步管道):

.subscribe

编辑1: 通过更新后的示例,您可以在这里使用@ngrx:

Subscription