Angular 角度2-同一组件的多条路由,无需重新实例化?

Angular 角度2-同一组件的多条路由,无需重新实例化?,angular,angular2-routing,Angular,Angular2 Routing,我希望在不重新实例化的情况下,为同一组件使用多个路由 示例路线: [ { path: 'test/:p1', component:component }, { path: 'test/:p1/:p2', component:component }, { path: 'test/:p1/:p2/:p3', component:component } ] 当我在路径之间切换时,组件被重新实例化,解析器再次运行。我提醒您不要使用查询参数 我的情况在本期中有详细描述: 有什么想法吗?我需

我希望在不重新实例化的情况下,为同一组件使用多个路由

示例路线:

[
  { path: 'test/:p1', component:component },
  { path: 'test/:p1/:p2', component:component },
  { path: 'test/:p1/:p2/:p3', component:component }
]
当我在路径之间切换时,组件被重新实例化,解析器再次运行。我提醒您不要使用查询参数

我的情况在本期中有详细描述:

有什么想法吗?我需要使用查询参数吗

我的解析器代码:

@Injectable()
export class MyResolver implements Resolve<MyObject[]> {

  constructor(private myService: MyService) {}

  resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<MyObject[]> {
    return this.myService.getData(route.params.id);
  }

}
@Injectable()
导出类MyResolver实现解析{
构造函数(私有myService:myService){}
解析(路由:ActivatedRouteSnapshot,状态:RouterStateSnashot):可观察{
返回this.myService.getData(route.params.id);
}
}

那不管用吗?这与其说是一个真正的解决方案,不如说是一个变通办法,但这是我能想到的最好办法:

resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<MyObject[]> | null {
  if (route.includes('test')) {
    return null;
  }

  return this.myService.getData(route.params.id);
}
resolve(路由:ActivatedRouteSnapshot,状态:RouterStateSnashot):可观测| null{
if(路线包括(“测试”)){
返回null;
}
返回this.myService.getData(route.params.id);
}

然后,您还可以在组件中管理这种情况,在这种情况下,您可以避免在解析器返回
null

时执行任何操作,这难道不起作用吗?这与其说是一个真正的解决方案,不如说是一个变通办法,但这是我能想到的最好办法:

resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<MyObject[]> | null {
  if (route.includes('test')) {
    return null;
  }

  return this.myService.getData(route.params.id);
}
resolve(路由:ActivatedRouteSnapshot,状态:RouterStateSnashot):可观测| null{
if(路线包括(“测试”)){
返回null;
}
返回this.myService.getData(route.params.id);
}
然后,您还可以在组件中管理这种情况,在这种情况下,您可以避免在解析器返回
null

时使用以下解决方法:

使用以下工具的解决方法:



再次运行解析程序有什么问题?是因为一些HTTP请求再次被触发吗?在这个问题上似乎没有任何更新,所以我相信目前只能找到解决这个问题的方法。您可以在解析器中监视当前路由/下一个路由是否被激活,这样,如果您已经来自包含组件的路径,它就不会触发请求。这可能是一个解决方案,即使当我从一个包含我的组件的路径来重新实例化(我的解析器获取http请求)时。你能显示你的解析器代码和组件构造函数/ngOnInit吗?解析器从数据服务返回可观数据,ngOnInit从激活的路由订阅数据-仅此而已。请添加你的解析器代码。这是唯一需要更改的内容,以避免执行额外的http调用。再次运行解析程序有什么问题?是因为一些HTTP请求再次被触发吗?在这个问题上似乎没有任何更新,所以我相信目前只能找到解决这个问题的方法。您可以在解析器中监视当前路由/下一个路由是否被激活,这样,如果您已经来自包含组件的路径,它就不会触发请求。这可能是一个解决方案,即使当我从一个包含我的组件的路径来重新实例化(我的解析器获取http请求)时。你能显示你的解析器代码和组件构造函数/ngOnInit吗?解析器从数据服务返回可观数据,ngOnInit从激活的路由订阅数据-仅此而已。请添加你的解析器代码。这是唯一需要更改的内容,以避免执行额外的http调用。非常感谢您的想法,但我正在寻找最佳实践。目前,我已经重新设计了路由体系结构,很少有共享数据的路由子级。要么这是一个真正复杂的情况,要么这是一个潜在的体系结构问题。。。我不认为你能做任何事情,除了在解析器中解决这个问题。另一个解决方案是存储HTTP请求的可观察性以再次为其服务(从而避免在可用时重新执行调用)。您的下一个问题是管理何时清除此存储的observable以实际更新获取的数据。当我有路由子路由时,当我更改子路由时,仅当我初始化父路由时,数据不会再次解析。是的,因为已到达父路由。
resolve()。目前,我已经重新设计了路由体系结构,很少有共享数据的路由子级。要么这是一个真正复杂的情况,要么这是一个潜在的体系结构问题。。。我不认为你能做任何事情,除了在解析器中解决这个问题。另一个解决方案是存储HTTP请求的可观察性以再次为其服务(从而避免在可用时重新执行调用)。您的下一个问题是管理何时清除此存储的observable以实际更新获取的数据。当我有路由子路由时,当我更改子路由时,仅当我初始化父路由时,数据不会再次解析。是的,因为已到达父路由。
resolve()