首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >呈现一个BehaviourSubject:在模板中使用getValue()可以吗?

呈现一个BehaviourSubject:在模板中使用getValue()可以吗?
EN

Stack Overflow用户
提问于 2020-05-22 10:31:12
回答 4查看 1.2K关注 0票数 1

我有一个角(9)分量,它得到BehaviourSubjects。我学习从许多像这样的来源在显示可观察内容时使用async-pipe (而不是在ngInit中订阅)。也有as不重复它的所有时间。但是因为他们毕竟是BehaviourSubjects,我可以简单的做

代码语言:javascript
复制
<div>{{behaviourSubject.getValue()}}</div>

或者别的什么。实际上,对我来说,它似乎要干净得多,然后使用“异步”,实际上这里和那里的问题都少了。但我不确定这是一个好的模式,还是它有严重的缺点?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-05-22 10:50:44

BehaviorSubject通常驻留在服务内部,以便向其他服务/组件分配新值,以保持它们的最新。

一个好的做法是将BehaviorSubject声明为私有的,并且只公开.asObservable(),这样消费者就不允许直接更改它的值。

这就是为什么我们必须在提供的可观察源上使用异步管道的原因。

第二个原因:异步管道会自动取消对可观测数据的订阅。版本:与提供主题值而不需要订阅的.getValue()进行比较,在这个用例中,主题的管道没有明显的好处。

票数 3
EN

Stack Overflow用户

发布于 2020-05-22 13:27:14

我建议你参考本·莱什(“RxJS”的作者)关于这个主题的答案,这里

99.9%的时间您应该使用而不是使用getValue()

有多种原因.

  • 在角度上,您将无法使用OnPush ChangeDetectionStrategy。不使用它会使应用程序变慢,因为角将不断尝试将值与缓存的视图值同步。在您的情况下,它甚至需要首先调用getValue函数。
  • 当BehaviourSubject错误或完成时,您将无法调用getValue
  • 通常,使用getValue (我甚至认为是BehaviourSubject )是没有必要的,因为您可以通过在另一个可观察的源上使用可观察的运算符来表达大多数可观测性。只有当你需要将一个无法观察到的事件转化为一个可观察的事件时,才是真正需要主题的地方。

虽然不使用async看上去可能更干净,但实际上您正在将艰苦的工作转移到角上,这需要确定它何时应该调用getValue()

票数 4
EN

Stack Overflow用户

发布于 2020-05-22 12:14:45

在模板表达式中调用方法是您想要避免的第一件事,在Angular.It中,调用模板中的方法被认为是错误的做法。点击在这里获得更多关于该方法的详细信息。

正如Gerome所提到的,使用异步管道将行为主题公开为一个可观察的对象并在模板中订阅它是一种正确的方法,而且由于它是一个行为主题,它总是在订阅时发出的最新值,因此您也可以避免使用getValue()方法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61952995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档