Angular 如何根据@ngrx中的路由获取数据?

Angular 如何根据@ngrx中的路由获取数据?,angular,redux,ngrx,ngrx-router-store,Angular,Redux,Ngrx,Ngrx Router Store,我们构建了一个webapp,用户必须点击列表才能进入特定的编辑视图。例如,从登录页,用户选择一个客户端,然后选择一个代理,然后进入该代理的编辑视图。在这种情况下,URL将保存ID:/client/4/agent/7/edit。用于处理URL更改,因此当直接访问上面的URL时,将显示编辑视图并正常工作 该应用程序还包含一个面包屑,当Client={ID:4,name:'Company}和Agent={ID:7,name:'Postal}时,它显示的不是ID而是路径片段的名称。我们通常在单击对应列表

我们构建了一个webapp,用户必须点击列表才能进入特定的编辑视图。例如,从登录页,用户选择一个客户端,然后选择一个代理,然后进入该代理的编辑视图。在这种情况下,URL将保存ID:
/client/4/agent/7/edit
。用于处理URL更改,因此当直接访问上面的URL时,将显示编辑视图并正常工作

该应用程序还包含一个面包屑,当
Client={ID:4,name:'Company}
Agent={ID:7,name:'Postal}
时,它显示的不是ID而是路径片段的名称。我们通常在单击对应列表条目时获取此数据(
client
agent

但是,当直接访问像
/client/4/agent/7/edit
这样的URL时,存储的
client
-对象中没有包含该名称当直接以reduxy方式访问URL时,如何获取属于某个路由的对象?我知道如何将其破解到应用程序中,但数据流应该保持良好且干净的reduxy

我考虑过的事情:

  • 检查每个组件中是否存在
    客户端
    代理
    等,如果不存在,则获取它们。这可能会造成大量开销,此外,逻辑应该进入无法触发操作的选择器
  • 使用服务检查数据是否已经存在-如果没有,则加载它。将在每次URL更改时进行检查,并且可能会减慢应用程序的速度
  • 在应用程序的初始加载时触发数据提取-在哪里执行<代码>应用组件

我也愿意重新构造整个应用程序(使用另一个路由,引入@ngrx/effects,重新定义API等)

实现这一点的一个方法是创建自定义

然后在组件中,在调用EntityCollectionService(即,对于entityCollection)之前设置自定义路径


对于单个实体,请调用setEntityUrl方法。

是否尝试使用“ngrx/路由器存储”?!?它将监听URL上的每一个更改并添加到您的redux存储中。问题是:我应该在哪里听路由器事件-在Breadcrum Reducer中?我如何知道数据(
客户端
代理
)是否已处于状态?抱歉@frot.io,我错过了您已经在使用@ngrx/router store的消息。这是一个非常好的例子,与您正在尝试做的事情类似
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { DefaultDataService, HttpUrlGenerator, Logger } from '@ngrx/data';
import { Hero } from '../../model/job/hero';

@Injectable({
  providedIn: 'root'
})
export class HeroDataService  extends DefaultDataService<Hero> {

  constructor(http: HttpClient, httpUrlGenerator: HttpUrlGenerator, logger: Logger) {
    super('Hero', http, httpUrlGenerator);
    logger.log('Created custom Hero EntityDataService');
  }

  public setEntitiesUrl(entitiesUrl) {
    this.entitiesUrl = entitiesUrl;
  }

  public setEntityUrl(entityUrl) {
    this.entityUrl = entityUrl;
  }

}
  constructor(
    heroDataService: HeroDataService
    ) {
    entityDataService.registerService('Hero', heroDataService);
  }
this.heroDataService.setEntitiesUrl('myCustomPath');
this.heroes$ = this.heroService.getAll();