【问题标题】:What happened with subscription if subject was destroyed in angular 2+?如果主题在 Angular 2+ 中被破坏,订阅会发生什么?
【发布时间】:2018-07-09 06:45:23
【问题描述】:

更新有关可观察使用情况的更多详细信息

我需要服务,因为 checkboxcell 组件不能使用 @Output() 属性。 发生这种情况是因为 ag-grid api 使用错误 - 渲染器组件被用作编辑器。暂时无法更正。

@Component({
    ...
    template: `<mat-checkbox (change)="onChanged($event)"></mat-checkbox>`
})
export class CheckboxCellComponent implements ICellRendererAngularComp {
    ...
    //each component that use checkboxcell provide own instance of PermissionChange
    constructor(private permissionChange: PermissionChange) {

    }
    public onChanged({ checked }): void {
         //use observable
         this.permissionChange.changeEvent.next();
    }
}

原始问题

我有一个简单的服务

export class PermissionChange {
    public changeEvent: Subject<void>;
    constructor() {
        this.changeEvent = new Subject<void>();
    }
}

以及使用该服务的组件:

@Component({
    ...
    providers: [PermissionChange]
})
export class ...Component implements OnInit {
    constructor(
        private permissionChange: PermissionChange,
    ) { }

    public ngOnInit(): void {
        //subscription
        this.permissionChange.changeEvent.subscribe(() => {...});
    }
}

PermisionChange 是这个组件的个人提供者 => PermisionChange 的实例将在组件被销毁的那一刻被销毁 => changeEvent observable 也将被销毁。所以也许没有必要取消订阅,也许订阅也会被破坏?但我不知道如何检查。

【问题讨论】:

  • stackoverflow.com/questions/36494509/… 的可能重复项。特别注意第二个答案。 EventEmitter 只能在组件中使用。在 Injectable 中你应该使用普通的 Observables
  • @PierreMallet 我使用了 observable 并编辑了问题。
  • 服务的实际代码是什么?这很重要。 observable 是如何真正创建的,它何时发出事件?
  • 但是您添加了一个从不发出数据的可观察对象。很难说您需要取消订阅。如果你的 changeEvent 不是 Subject (如果它在第一次发射后完成,你不需要取消订阅)。但正如 JB NIzet 所说,如果没有太多实施细节,我们无法为您提供帮助

标签: angular observable subscription unsubscribe


【解决方案1】:

这种情况下不需要取消订阅:父组件、子组件和服务实例都将被销毁,并且在父组件被销毁时有资格进行垃圾回收。

任何活动都不会在服务中保留对主题的引用,因此它也符合 GC 的条件。

【讨论】:

  • 我刚刚阅读了有关主题的更多信息,因此订阅 - 是一次性资源。当我写 changeEvent.subscribe() - 资源被分配。我不确定销毁 changeEvent 对象会导致订阅的处置。也许你知道如何检查它?
  • 是的,因为资源不是分配在空间的某个地方,而是在主题实例中,所以当主题被销毁时,所有资源也都被释放了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-24
  • 2015-11-17
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
  • 2019-06-15
相关资源
最近更新 更多