发布于 2020-05-22 10:50:44
BehaviorSubject通常驻留在服务内部,以便向其他服务/组件分配新值,以保持它们的最新。
一个好的做法是将BehaviorSubject声明为私有的,并且只公开.asObservable(),这样消费者就不允许直接更改它的值。
这就是为什么我们必须在提供的可观察源上使用异步管道的原因。
第二个原因:异步管道会自动取消对可观测数据的订阅。版本:与提供主题值而不需要订阅的.getValue()进行比较,在这个用例中,主题的管道没有明显的好处。
发布于 2020-05-22 13:27:14
我建议你参考本·莱什(“RxJS”的作者)关于这个主题的答案,这里
99.9%的时间您应该使用而不是使用getValue()
有多种原因.
OnPush ChangeDetectionStrategy。不使用它会使应用程序变慢,因为角将不断尝试将值与缓存的视图值同步。在您的情况下,它甚至需要首先调用getValue函数。getValue。getValue (我甚至认为是BehaviourSubject )是没有必要的,因为您可以通过在另一个可观察的源上使用可观察的运算符来表达大多数可观测性。只有当你需要将一个无法观察到的事件转化为一个可观察的事件时,才是真正需要主题的地方。虽然不使用async看上去可能更干净,但实际上您正在将艰苦的工作转移到角上,这需要确定它何时应该调用getValue()。
发布于 2020-05-22 12:14:45
在模板表达式中调用方法是您想要避免的第一件事,在Angular.It中,调用模板中的方法被认为是错误的做法。点击在这里获得更多关于该方法的详细信息。
正如Gerome所提到的,使用异步管道将行为主题公开为一个可观察的对象并在模板中订阅它是一种正确的方法,而且由于它是一个行为主题,它总是在订阅时发出的最新值,因此您也可以避免使用getValue()方法。
https://stackoverflow.com/questions/61952995
复制相似问题