Angular 每次激活RouteGuard时重新加载ngrx状态数据
对于实体的受保护视图,我使用Angular 每次激活RouteGuard时重新加载ngrx状态数据,angular,typescript,angular2-routing,ngrx,ngrx-store,Angular,Typescript,Angular2 Routing,Ngrx,Ngrx Store,对于实体的受保护视图,我使用RouteGuard将所需视图的所需数据预加载到ngrx存储中。但是,来自后端的相应数据可能会随着时间的推移而变化。因此,每次激活路由时,存储的旧状态都应该被来自后端的新数据覆盖(如果有)。仅当新数据已加载到存储区且完全可用时,才应激活路由。这可能是因为在此期间,该实体已在后端被删除 为此,我有以下最简单的例子: 在当前实现中,每次调用路由时都会调用操作GetEntity(),从后端加载数据。但路由仍然根据存储的先前状态激活,这不是所需的行为。旧状态应以某种方式无效或
RouteGuard
将所需视图的所需数据预加载到ngrx存储中。但是,来自后端的相应数据可能会随着时间的推移而变化。因此,每次激活路由时,存储的旧状态都应该被来自后端的新数据覆盖(如果有)。仅当新数据已加载到存储区且完全可用时,才应激活路由。这可能是因为在此期间,该实体已在后端被删除
为此,我有以下最简单的例子:
在当前实现中,每次调用路由时都会调用操作GetEntity()
,从后端加载数据。但路由仍然根据存储的先前状态激活,这不是所需的行为。旧状态应以某种方式无效或删除,以无法激活路由。以下是
RouteGuard
的canActivate
功能的逻辑:
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
return this.store.pipe(select(selectEntityMap)).pipe(
map(taskMap => Object.keys(taskMap).length > 0),
tap(loaded => {
this.store.dispatch(GetEntity()); // trigger backend loading
}),
filter(loaded => !!loaded), // waiting until the enties has been loaded.
take(1),
);
}
因此,有两个问题:
canActivate(路由:ActivatedRouteSnapshot,状态:RouterStateSnashot){
//它应该将'taskMap'重置为未定义。
//taskMap的初始值必须为null(任何值,但未定义)。
this.store.dispatch(GetEntity());
返回此.store.pipe(选择(selectEntityMap)).pipe(
skipWhile(taskMap=>taskMap!==未定义),//等待启动
skipWhile(taskMap=>taskMap===未定义),//等待到结束
以(1)为例,
映射(taskMap=>taskMap!==null),
);
}
@可注入({
providedIn:'根'
})
导出类UserResolversService实现Resolve您的第一个想法无法正常工作,因为RouteGuard仍在基于旧状态激活规则。我通过在后端删除实体并重新加载页面来测试这一点。旧状态仍然存储了已删除的实体,并且正在使用旧状态而不是不包含实体的新状态激活路由是有意义的。我会投票支持装载旗。初始状态是什么?例如,它可以为null吗?空-加载,空对象/加载的对象-像这样?在解析器中,您可以调度存储操作并将其解析为ngrx选择器。我明白了,然后我们需要一个标志或使用未定义的作为值来指示加载<代码>跳过(值=>值!==未定义),跳过(值=>值===未定义)
。如果初始状态为null,并且GetEntity
在开始时将其设置为未定义,那么应该可以工作。我已经更新了答案。如果taskMap为null,则返回false。