Angular 2 - 没有重新实例化的同一个组件的多个路由?

Angular 2 - 没有重新实例化的同一个组件的多个路由?

问题描述:

我想为同一个组件使用多个路由而不需要重新实例化。Angular 2 - 没有重新实例化的同一个组件的多个路由?

实施例路线:

[ 
    { path: 'test/:p1', component:component }, 
    { path: 'test/:p1/:p2', component:component }, 
    { path: 'test/:p1/:p2/:p3', component:component } 
] 

在i路径分量之间切换被重新实例化和旋转变压器再运行。我提醒说不要使用查询参数。 Optional Parameters for angular2 routes #12347

任何想法:

我的情况下,在这个问题上恰恰说明?我需要使用查询参数吗?

我的解析器代码:

@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); 
    } 

} 
+0

什么用解析器的问题被再次运行?是关于一些HTTP请求再次被触发的吗? 在这个问题上似乎没有任何更新,所以我相信只有解决方法可以找到这个解决方案呢。 你可以做的是在你的解析器中监视当前路由/下一个被激活的路由,以便在你已经从包含你的组件的路径出来时不会触发请求。这可能是一个解决方案 –

+0

即使我从一个包含我的组件的路径重新实例化(我的解析器获取http请求)。 – Jarek

+0

你可以显示你的解析器代码和组件构造函数/ ngOnInit吗? –

这样不是工作?它更是一个解决办法不能真正解决问题的,但是这是我能拿出最好的:

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

    return this.myService.getData(route.params.id); 
} 

然后你也可以在你的组件,你避免的情况下,做任何事情你解析器返回null管理这种情况下, 。使用

+0

非常感谢您的想法,但我正在寻找最佳实践。现在我重新设计了路线架构,并且很少有共享数据的路由子项。 – Jarek

+0

要么这是一个真正的复杂案例,要么存在底层的体系结构问题......我认为除解决方案中的问题之外,您不能做其他任何事情。 另一种解决方案是存储HTTP请求的可观察性以再次提供服务(从而避免在可用时重新进行呼叫)。你的下一个问题是管理何时清除这个存储的observable来实际更新所获取的数据。 –

+0

当我有路线的孩子数据不会再次解决时,我改变儿童路线,只有当我初始化父母。 – Jarek

解决方法一URLMatcher

const routes: Routes = [{ 
    matcher: urlSegments => 
    urlSegments[0] && urlSegments[0].path === 'test' ? { 
     consumed: urlSegments, 
     posParams: { 
     ...urlSegments[1] && {p1: urlSegments[1]}, 
     ...urlSegments[2] && {p2: urlSegments[2]}, 
     ...urlSegments[3] && {p3: urlSegments[3]} 
     } 
    } : 
    null, 
    component: component 
}];