angular - NgRx router-store 在离开当前页面时发出路由参数更改
问题描述
我有一个 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();
}
}
解决方案
通过传入的配置对象将导航操作时间更改为:PostActivation
StoreRouterConnectingModule.forRoot
@NgModule({
imports: [
CommonModule,
...
StoreRouterConnectingModule.forRoot({
navigationActionTiming: NavigationActionTiming.PostActivation,
}),
],
})
推荐阅读
- php - 使用变量而不是术语 MYSQLI_ASSOC
- asp.net-mvc - 缺少默认 MVC 标头
- xcode - mac上的nativescript nsbuilduser目录?
- c++ - 谷歌风格指南(前向声明部分)
- python - 输入表单数据时django模型错误
- keystore - 在 spring 云配置服务器上使用非对称密钥作为 PEM 编码的文本
- batch-file - 仅通过 SET 更改小写字母?
- graphql - 如何使用 graphql apollo-server 调节(后处理)解析的数组
- image - Slick carousel 的图片现在仅在从成功的 Facebook Connect 回来后才会显示
- node.js - 错误:找不到模块“body-Parser”部署 HEROKU