Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 每次激活RouteGuard时重新加载ngrx状态数据_Angular_Typescript_Angular2 Routing_Ngrx_Ngrx Store - Fatal编程技术网

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),
    );
  }
因此,有两个问题:

  • 如何更改RouteGuard,使其在每次激活时从后端加载数据,并且仅使用新加载的数据激活路由?
  • RouteGuard是实现从后端重新加载逻辑的正确位置,还是需要对状态或效果进行进一步调整?
  • 方法是在您的保护启动时添加一个标志,即数据应该被刷新,并且仅当数据被刷新时才发出
  • 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。