我读了一篇关于
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>
如果没有,哪种方法是正确的?
最佳答案
一般来说,您不应该公开Subject
s,因为这使任何使用您的服务的人都有可能无法控制地调用drawerTrigger$.next()
,即使在不正确的用例中也是如此。
甚至最糟糕的情况是任何人都可以使用drawerTrigger$.error()
或drawerTrigger$.complete()
。受试者有内部状态,如果他们发出error
或complete
信号,受试者将被标记为停止,并且永远不会发出任何信号。如果公开Subject
,则允许任何人发出这些通知。
官方推荐的从typescript类中公开主题的方法是强制其类型Observable
。您不需要使用asObservable()
(rxjs本身不在其代码库的任何地方内部使用asObservable()
):
export class ExampleComponent {
private drawerTriggerSubject = new Subject<{}>();
public drawerTrigger$: Observable<{}> = this.drawerTriggerSubject;
}