angular - 以这种方式在 Angular 中使用主题是否存在安全风险?

标签 angular typescript rxjs subject

每次我必须在不同的组件中使用可以随时间更改的变量时,我都会将该变量存储在服务中并将值包装在主题中,以便在调用下一个组件时每个组件寄存器都会发生变化。 但后来我看到教程提到使用主题时必须小心。他们执行以下操作:

// in some service
private subject$: Subject<any> = new Subject();
subjectAsObservable: Observable<any> = this.subject$.asObservable();

然后在组件中使用可观察对象,但随后我将无法调用 next 来发出新值。

按以下方式使用 subject 是否存在风险:

// in some service
subject$: Subject<any> = new Subject();

然后在组件中订阅该主题,如果组件对变量进行更改,则调用 next 并且订阅该主题的每个组件都会获取新值。

以下实现是否与上面的实现不同(更“安全”):

private subject$: Subject<any> = new Subject();

emitNewValue(value: any): void {
    this.subject$.next(value);
}

getSubject(): Subject<any> {
    return this.subject$:
}

我不太了解安全风险。我该如何正确处理主题?

最佳答案

这是关于封装的。在较大的应用程序中,最好只有一个位置发送到共享流(主题),即服务中。

然后,其他组件就不会意外地调用该主题的 complete() 等。在服务中,只需提供一种方法即可发出(在您的示例中为emitNewValue)。不需要主题的 getter,因为使用 asObservable 公开主题可以为组件提供主题的只读副本,以便组件可以监听/订阅。

关于angular - 以这种方式在 Angular 中使用主题是否存在安全风险?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69427955/

相关文章:

angular - 如何对 () => void 类型的变量进行单元测试

javascript - Angular Pipe - groupBy 字符串的子字符串(自定义管道)

angular - 在使用 Angular2 Guards 执行 canActivate 之前,如何从服务响应中获取数据

由于打字导致的 TypeScript 编译错误

服务中的 Angular 4 数据,传递给组件

angular - 如何检测 angular2 中的引导日期时间选择器更改事件

typescript - 在同一行的 typescript 中创建和初始化字典

angular - RxJS - Subscriber 与 Observable 和 Subscription 有何不同?

javascript - Zip 可重放的 RxJS 可观察对象

javascript - 是否可以创建没有初始值的 BehaviourSubject<void>() ?