Angular 角度+;离子型2+;ngrx/商店-取消订阅不';行不通

Angular 角度+;离子型2+;ngrx/商店-取消订阅不';行不通,angular,ionic2,rxjs,observable,ngrx-store,Angular,Ionic2,Rxjs,Observable,Ngrx Store,我有一个实现了ngrx/store的ionic2应用程序,我遇到了一个奇怪的行为 nav:Subscription; ngOnInit(): void { this.nav = this.store.select(fromRoot.getLoginState).subscribe(res => { if(res){ this.navCtrl.setRoot(TabsPage); } }) } ngOnDestroy

我有一个实现了ngrx/store的ionic2应用程序,我遇到了一个奇怪的行为

nav:Subscription;

ngOnInit(): void {
    this.nav = this.store.select(fromRoot.getLoginState).subscribe(res => {
        if(res){
            this.navCtrl.setRoot(TabsPage);
        }
    })
}

ngOnDestroy(): void {
    this.nav.unsubscribe()
}
store.select(fromRoot.getLoginState)返回一个布尔值,如果是真的,我想在Ionic 2中将TabsPage设置为root。 显然,我只希望它发生一次,所以我取消了onDestroy生命周期挂钩中的订阅

但是,取消订阅似乎不起作用,每次我更改状态时,它都会将视图设置回Tabspage(因此订阅仍然启动)

有什么想法吗


干杯

您应该在订阅中取消订阅

this.nav = this.store.select(fromRoot.getLoginState).subscribe(res => {
        if(res){
            this.navCtrl.setRoot(TabsPage);
        }
        //condition to check the required data is available 
         this.nav.unsubscribe();
}

ngrx
使用
rxjs
可观察的
s,当您不在乎能够在收到结果之前取消订阅时,可以很容易地将其转换为
Promise
s来接收这样的单个值

如果您真的只需要一个值,并且不会监视存储的登录状态更新,那么
可观察。toPromise
比处理订阅更容易,并且使代码的意图更清晰

下面是您使用
toPromise
的示例:

//注意这里没有分配,因为不需要取消订阅
this.store.select(fromRoot.getLoginState.toPromise())
.then(res=>res&&this.navCtrl.setRoot(TabsPage));

这是什么意思
ngrx/store-implemented
?我们可以有关于这个的参考url吗?this.store.select(fromRoot.getLoginState)返回特定状态的可观察值,在本例中,它只是一个布尔值