首页 > 解决方案 > 将您的 RxJS 主题暴露给“外部世界”是否“安全”

问题描述

我读了这篇关于 Angular onPush Change Detection Strategy的好文章

他在某个地方写道:

通过使用 asObservable() 方法将您的主题暴露给外界,始终暴露可观察对象是一种反模式。

但他没有解释原因。这是否意味着我不应该做这样的事情?

export class ExampleComponent {

  public drawerTrigger$ = new Subject<{}>(); 
}

并在 HTML

  <button  class="hamburgher-button" type="button"
     (click)="drawerTrigger$.next($event)">
    <i >menu</i>
  </button>

如果不是,这是正确的方法?

标签: angulartypescriptrxjs

解决方案


通常,您不应该公开Subjects,因为这使任何使用您的服务的人都可能无法控制地调用drawerTrigger$.next(),即使在不正确​​的用例中也是如此。

甚至最坏的情况是任何人都可以使用drawerTrigger$.error()drawerTrigger$.complete()。主题具有内部状态,如果它们发出errorcomplete主题被标记为停止并且永远不会发出任何东西。如果你暴露你的Subject然后你让任何人发出这些通知。

官方推荐的从 TypeScript 类中公开 Subjects 的方法是强制它们的类型为Observable. 您不需要使用asObservable()(RxJS 本身不会asObservable()在其代码库中的任何地方内部使用):

export class ExampleComponent {
  private drawerTriggerSubject = new Subject<{}>(); 
  public drawerTrigger$: Observable<{}> = this.drawerTriggerSubject;
}

推荐阅读