Ngrx确实像一个行为主体(BehaviorSubject),当您第一次订阅时,您可以获得当前值。
问题可能是您将价值从行为主体(商店)推到了正常主体(
mode$
)在订阅该主题之前。这意味着你将初始值推入你的主题(
模式$
)而且它将没有订户通知,所以它失败了。当订阅者订阅
模式$
我的建议是去掉中间人,将从商店返回的可见物直接暴露在视图中,如下所示:
this.mode$ = this.store.select(...);
通过这种方式,您将公开一个可观察对象,该对象将向任何订阅者提供订阅时的当前值。
我发现很难找到异步管道订阅的组件生命周期中的具体文档。所以我做了一个测试,在每个生命周期钩子中发布到一个主题,并通过异步管道订阅。
代码:
import {
Component,
OnChanges,
OnInit,
DoCheck,
AfterContentInit,
AfterContentChecked,
AfterViewInit,
AfterViewChecked,
OnDestroy,
} from '@angular/core';
import { Subject } from 'rxjs/Subject';
import 'rxjs/add/operator/do';
@Component({
selector: 'app-test',
template: '{{ data$ | async }}'
})
export class TestComponent implements
OnChanges,
OnInit,
DoCheck,
AfterContentInit,
AfterContentChecked,
AfterViewInit,
AfterViewChecked,
OnDestroy {
public get data$() {
return this.data.asObservable().do(x => console.log('event: ', x));
}
public data: Subject<string> = new Subject<string>();
ngOnChanges() {
this.data.next('ngOnChanges');
}
ngOnInit() {
this.data.next('ngOnInit');
}
ngDoCheck() {
this.data.next('ngDoCheck');
}
ngAfterContentInit() {
this.data.next('ngAfterContentInit');
}
ngAfterContentChecked() {
this.data.next('ngAfterContentChecked');
}
ngAfterViewInit() {
this.data.next('ngAfterViewInit');
}
ngAfterViewChecked() {
this.data.next('ngAfterViewChecked');
}
ngOnDestroy() {
this.data.next('ngOnDestroy');
}
}
结果:
event: ngAfterViewInit
event: ngAfterViewChecked
event: ngDoCheck
event: ngAfterContentChecked
event: ngAfterViewChecked
结果表明,异步管道首先在您第一次订阅的ngOnInit之后执行。这可以解释为什么你错过了它。