我使用以下方法构建了一个简单的确认对话框服务(Angular 2):

confirm(body?: string, title?: string): Subject<void> {
    this.confirmation = new Subject<void>();
    // ... show dialog here... "are you sure?"
    return this.confirmation;
}

_onYesClicked() {
  // ... closing the dialog
  this.confirmation.next();
  this.confirmation.complete();
} 

_onNoClicked() {
  // ... closing the dialog
  this.confirmation.complete();
}

用法:

confirmationService.confirm().subscribe(() => alert("CONFIRMED"));

如果有人使用该服务,他将返回一个主题(这是一个可观察对象),并且可以"订阅()"它.单击"是"时会调用订阅,因此会给出确认.

这是正确的方法吗?更重要的是...电话会打给我吗

this.confirmation.complete();

取消订阅订阅的侦听器,从而防止任何延迟引用(内存泄漏)?

推荐答案

如果你想确保它删除了所有的观察者,你可以在https://github.com/ReactiveX/rxjs/blob/master/src/internal/Subject.ts#L91分钟内自己判断它.它在所有观察者上调用complete()(观察者通常只是实现Observer interface的哑对象),然后设置this.observers.length = 0;.所以答案是肯定的.

你的方法是有效的,基本上和Angular2对EventEmitter的处理方法一样.只有一件事可以改进,那就是在expose Subject秒时开始使用asObservable().这将隐藏一个事实,即你在下面使用Subject,并且只返回一个常规的可观察值.这样你就不会让你的用户意外地(或出于误解)try 在Subject上拨打next()complete()error().

关于内存泄漏,这必须由RxJS来处理,因此您不必担心它,如果有问题,作者可能会在您之前注意到.

再看看这个:Observable vs Subject and asObservable

Angular相关问答推荐

升级到angular 17并转换为独立的加载器拦截器后,

如何在Angular中执行一个操作条件为多个可观测值?

为什么我的自定义.d.ts不起作用?LeaderLine不是构造函数

从、管道和映射可观察到的逻辑?

如何使用ChangeDetectionStrategy.OnPush?

在RxJS和ANGING中处理多个API调用

元素上的Angular 管道链接不起作用

无法在Mat-SideNav中绑定模式

Moment.js 和 Angular 库

Angular 15 Ref 错误:初始化前无法访问组件 A

在 Angular material 表单元格中渲染 html

如何在 Angular 2 模板中使用枚举

使用directive指令将类添加到host元素中

*ngIf 和 *ngFor 在 元素上使用

如何在 Angular CLI 1.1.1 版中将路由模块添加到现有模块?

Angular:ViewChild 上未定义 nativeElement

如何使用 CLI 创建特定版本的 Angular 项目?

Angular2 Routerlink:添加查询参数

NPM 脚本 start退出,但未指示 Angular CLI 正在侦听请求

如何在 Angular CLI 6: angular.json 中添加 Sass 编译?