我读了一篇关于
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>

如果没有,哪种方法是正确的?

最佳答案

一般来说,您不应该公开Subjects,因为这使任何使用您的服务的人都有可能无法控制地调用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;
}

08-26 22:38