我读了这篇关于 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>
如果否,那是正确的方法?
答案 0 :(得分:10)
通常,您不应该公开Subject
,因为即使在不正确的用例中,这也会使使用您的服务的任何人都无法控制地调用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;
}
答案 1 :(得分:-1)
说实话,这并没有太大的不同。
撰写此内容
export class X {
private subject = new Subject();
}
您仍然可以通过
访问主题const x = new X();
x['subject'].next('value');
所以,实际上,这是一种智能的便利,而不是一种好的/不好的做法。
我建议您随心所欲:如果您需要访问您的主题,则将其设置为public:如果不需要,请不要公开它。