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

Are there any security risks using subjects in Angular this way?

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

// 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 公开主题会为组件提供主题的只读副本,它们可以 listen/subscribe 到。