如何初始化订阅对象

我正在使用订阅从角度的路线中获取参数。这是代码:

import { Component, OnInit, OnDestroy } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { Subscription} from 'rxjs';

@Component({
    selector: 'farm-house',
    templateUrl: './house.component.html',
    styleUrls: ['./house.component.scss']
})
export class GreenhouseComponent implements OnInit, OnDestroy {

    private routeSub: Subscription;
    id: string;

    constructor(private route: ActivatedRoute) {
        this.id = "";
    }

    ngOnInit(): void {
        this.routeSub = this.route.params.subscribe(params => {
            this.id = params['id'];
        });
    }

    ngOnDestroy() {
        this.routeSub.unsubscribe();
    }
}

但问题是编译器说:

属性 'routeSub' 没有初始化器,也没有在构造函数中明确分配。

我的问题是,初始化订阅对象的最佳方法是什么?

stack overflow How to initialize a Subscription object
原文答案
author avatar

接受的答案

我想出了另一个解决方案,它使用来自 Subscription.EMPTYthis question

import { Component, OnInit, OnDestroy } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { Subscription} from 'rxjs';

@Component({
    selector: 'farm-house',
    templateUrl: './house.component.html',
    styleUrls: ['./house.component.scss']
})
export class GreenhouseComponent implements OnInit, OnDestroy {

    private routeSub: Subscription;
    id: string;

    constructor(private route: ActivatedRoute) {
        this.routeSub = Subscription.EMPTY;
        this.id = "";
    }

    ngOnInit(): void {
        this.routeSub = this.route.params.subscribe(params => {
            this.id = params['id'];
        });
    }

    ngOnDestroy(): void {
        if(this.routeSub) {
            this.routeSub.unsubscribe();
        }
    }
}

答案:

作者头像

大多数情况下,在取消订阅之前检查订阅就足够了。

 ngOnDestroy() {
     if(this.routeSub) {
       this.routeSub.unsubscribe();
     }
 }

在您的情况下,不需要初始化订阅,因为您已经在 ngOnInit() 中调用了订阅方法。可能会出现错误,因为您直接在 unsubscribe() 上调用 Subscription 而不检查它是否已初始化。

作者头像

应该只是

private routeSub: Subscription = new Subscription

这对我有用。

作者头像

如果您声明 routeSub: any; 编译器不应该抱怨。资料来源:看到它在 this post 中完成,我为我工作

作者头像

这里不需要取消订阅,因为 Angular 会为你销毁这个特定的订阅。