将您的RxJS主题暴露给“外部世界”是否“安全”

时间:2018-09-07 12:51:52

标签: angular typescript 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>

如果否,那是正确的方法?

2 个答案:

答案 0 :(得分:10)

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

即使是最坏的情况,任何人都可以使用drawerTrigger$.error()drawerTrigger$.complete()。主体具有内部状态,如果它们发出errorcomplete,则该主体被标记为已停止,并且永远不会发出任何东西。如果您公开Subject,那么任何人都可以发出这些通知。

从TypeScript类公开主题的官方推荐方法是将其类型强制为Observable。您无需使用asObservable()(RxJS本身在其代码库中的任何地方都没有内部使用asObservable()):

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

答案 1 :(得分:-1)

说实话,这并没有太大的不同。

撰写此内容

export class X {
  private subject = new Subject();
}

您仍然可以通过

访问主题
const x = new X();
x['subject'].next('value');

所以,实际上,这是一种智能的便利,而不是一种好的/不好的做法。

我建议您随心所欲:如果您需要访问您的主题,则将其设置为public:如果不需要,请不要公开它。