angular - 将您的 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>
如果不是,这是正确的方法?
解决方案
通常,您不应该公开Subject
s,因为这使任何使用您的服务的人都可能无法控制地调用drawerTrigger$.next()
,即使在不正确的用例中也是如此。
甚至最坏的情况是任何人都可以使用drawerTrigger$.error()
或drawerTrigger$.complete()
。主题具有内部状态,如果它们发出error
或complete
主题被标记为停止并且永远不会发出任何东西。如果你暴露你的Subject
然后你让任何人发出这些通知。
官方推荐的从 TypeScript 类中公开 Subjects 的方法是强制它们的类型为Observable
. 您不需要使用asObservable()
(RxJS 本身不会asObservable()
在其代码库中的任何地方内部使用):
export class ExampleComponent {
private drawerTriggerSubject = new Subject<{}>();
public drawerTrigger$: Observable<{}> = this.drawerTriggerSubject;
}
推荐阅读
- python - 从命令行与从 Mu 编辑器运行 python3 的问题
- vue.js - VUE3 + IONIC - 类型 '{ bar(): any; 上不存在属性 'foo' }'
- git-branch - 在 Checkmarx 的代码扫描期间处理不同的 Git 分支?
- javascript - MatTableDataSouce 中未定义的键 _paginator :
- python - 有没有办法锁定组合框 PyQt?
- javascript - 在内容中使用 tabkey 导航时没有焦点事件
- floating-point - 浮点运算:用一个全精度插值对两个半精度浮点值进行插值
- java - 找不到网页 HTTP 404 - JSF 页面
- java - 配置 Geoserver 以在 Azure 应用服务上工作
- slack-api - “conversation.create”中的“restricted_action”错误代码是什么意思?