我有被条件show
激活的组件:
<app-list *ngIf="show"></app-list>
在激活该组件的地方,我还会发出事件:
this.tabsEvens.emitMoveToVersions(version);
this.router.navigate(["dictionary/versions/" + dict + '/' + code]);
问题是,我不能在组件app-list
中订阅此事件,因为还没有创建,所以这不起作用:
ngInit(){
this._moveToVersionSub = this.tabEvents
.listenMoveToVersions()
.subscribe((parameters: any) => { // can not get parameters here });
}
即使在发送发射后以及构建组件时如何捕获?
我更改了以下行:
this.router.navigate(["dictionary/versions/" + dict + '/' + code]);
this.tabsEvens.emitMoveToVersions(version);
它起作用了,首先它通过路由参数激活组件,然后发出事件
答案 0 :(得分:2)
您的问题是您发出均匀的声音,然后在该流上收听。但是当然,该事件在订阅者开始收听之前就已发出,因此您在这里将不会获得任何价值。
您可以使用BehaviorSubject代替普通的Subject。 BehaviorSubject始终向每个新订户发送最后一个值,即使该事件是在订户开始监听之前发出的。
在我看来,通常延迟事件以使每个组件都有机会开始收听事件流,这不是一个好主意。因为您开始猜测资源何时完成初始化。但是,如果某些事情减慢了初始化进度,则可能会破坏一切,最好选择一个干净的解决方案。
编辑示例:
tabEvents: Subject<any> = new Subject();
tabEvents.next('someevent')
this._moveToVersionSub = this.tabEvents
.listenMoveToVersions()
.subscribe((parameters: any) => { // nothing will happen here });
与BehaviorSubject相同的示例
tabEvents: BehaviorSubject<any> = new BehaviorSubject();
tabEvents.next('someevent')
this._moveToVersionSub = this.tabEvents
.listenMoveToVersions()
.subscribe((parameters: any) => { // parameters = 'someevent });
实现这两种解决方案没有区别。唯一的区别在于,使用BehaviorSubject会用'someevent'
触发订阅,因为BehaviorSubject会向每个在值发出后进行订阅的新订户发送此事件。
答案 1 :(得分:1)
您应该使用delay
。
如下:
example.pipe(
delay(2000)
subscribe( ...)
)
您可以了解更多信息:https://www.learnrxjs.io/operators/utility/delay.html