我有一个 Angular 组件,它需要响应适用于当前页面的路由参数更改。例如,也许我有路由page/:id
,如果:id
发生变化,我想通过重新加载组件的内容来响应。
使用ActivatedRoute
's paramMap
,这很容易。当我在page/:id
路线上时,我可以更改:id
URL 并且应用程序会做出适当的响应。当我离开page/:id
路线时,组件被破坏,并且不会发出任何参数更改。
但是,如果我尝试使用相同的方法@ngrx/router-store
,则会发出比我实际想要的更多的路由参数更改。我正在从正在导航到的路线中获取路线参数。这似乎是因为路由器存储在我的组件被破坏之前发出。
我需要一种方式来表达“我只想要这个页面的路由参数,并且一旦这个页面被导航离开,我需要你停止响应路由参数的变化。” 我认为这就像takeUntil(unsubscriber$)
在我的ngOnDestroy()
. 但是,这不起作用,因为下一个参数发射发生在ngOnDestroy()
被调用之前。
我想这种行为是设计使然,但我不确定如何克服我面临的问题。
我已经设计了一个Stackblitz 来演示这个问题。
使用 处理这种情况的最优雅的方法是@ngrx/router-store
什么?
工作示例使用ActivatedRoute
export class MyComponent implements OnInit, OnDestroy {
unsubscriber$ = new Subject<void>();
constructor(public route: ActivatedRoute) {}
ngOnInit() {
this.route.paramMap
.pipe(takeUntil(this.unsubscriber$))
.subscribe(params => {
// reload data
});
}
ngOnDestroy() {
this.unsubscriber$.next();
this.unsubscriber$.complete();
}
}
非工作示例使用router-store
export class MyComponent implements OnInit, OnDestroy {
unsubscriber$ = new Subject<void>();
constructor(public store: Store<State>) {}
ngOnInit() {
this.store
.pipe(select(selectRouteParams), takeUntil(this.unsubscriber$))
.subscribe(params => {
// reload data
// this code is being run even when this component is being navigated away from
});
}
ngOnDestroy() {
this.unsubscriber$.next();
this.unsubscriber$.complete();
}
}