您是否必须取消订阅组件中的QueryList?

时间:2018-07-18 00:36:48

标签: angular rxjs observable

使用@ContentChildren@ViewChildren装饰器侦听DOM元素的更改时。我是否需要退订QueryList

例如:

@Component({...})
export class ParentComponent implements AfterContentInit {
    @ContentChildren(ChildComponent)
    public children: QueryList<ChildComponent>;

    public ngAfterContentInit(): void {
        this.children.changes.subscribe(() => ....);
    }
}

以上内容是否有问题?

已更新:

我要问的原因是我们不必取消订阅@Output装饰。这些组件在销毁后会自动取消订阅。

我找不到任何说明QueryList相同的文档。

2 个答案:

答案 0 :(得分:5)

您不必退订QueryList。它为你做。

请参阅此处: https://github.com/angular/angular/blob/7d137d7f8872a6fba72668e32f9baf2c5dcfc48b/packages/core/src/linker/query_list.ts#L115

作为一般规则,当组件销毁后Observable仍然有效时,我将退订。在大多数情况下都可以使用。

答案 1 :(得分:0)

作为一般规则,在组件销毁时,最好退订已订阅的内容。在Angular中,您可以在ngOnDestroy方法中执行此操作。

import { Subscription } from 'rxjs';

@Component({...})

export class ParentComponent implements AfterContentInit, OnDestroy {
    @ContentChildren(ChildComponent)
    public children: QueryList<ChildComponent>;
    private childrenSubscription: Subscription;

    public ngAfterContentInit(): void {
        this.childrenSubscription = this.children.changes.subscribe(() => ....);
    }

    public ngOnDestroy(): void {
        this.childrenSubscription.unsubscribe();
    }
}