我目前的配置:
const routes: Routes = [
{ path: '', component: NavComponent, outlet: 'nav' }, // (1)
{ path: '**', component: NavComponent, outlet: 'nav' } // (2)
];
有效。始终将NavComponent
呈现给商店nav
。特别是,它适用于以下所有类型的URL:
http://example.com/foo(nav:bar) // (a) non-empty path in nav --> (2)
http://example.com/foo(nav:) // (b) empty path in nav --> (2)
http://example.com/foo // (c) no nav at all --> (1)
请注意路由器匹配到这些URL的不同路由:
(1)
用于(c)
(2)
用于(a)
和(b)
这就是为什么每次位置更改从NavComponent
到(c)
时,(a)
实例都会被销毁并重新创建。这是我需要预防的事情。我需要保留我的实例,因为它的状态,动画等等。据我所知,只有在所有网址都使用相同的路由时才有可能,但我无法找到办法做这个。如果我删除(1)
,则(c)
等网址会在NavComponent
中停止显示nav
。显然**
与这些网址不匹配(我不知道为什么会这样做。)
您可以在此处看到它:https://stackblitz.com/edit/angular-ptzwrm
这里适当的解决方案是什么?
目前,我overriding UrlSerializer
在解析之前将(nav:)
添加到(c)
等网址,但感觉就像是黑客。
答案 0 :(得分:3)
愚蠢的问题,但你不能简单地使用位置服务修改URL并保持在同一个组件上(并且只是更改动画的状态)吗?
否则,您可以实现自定义RouteReuseStrategy以强制重用组件
import { RouteReuseStrategy } from '@angular/router';
import {ActivatedRouteSnapshot} from '@angular/router';
import { DetachedRouteHandle } from '@angular/router';
/** Use defaults from angular internals, apart from shouldReuseRoute **/
export class CustomReuseStrategy implements RouteReuseStrategy {
shouldDetach(route: ActivatedRouteSnapshot): boolean { return false; }
store(route: ActivatedRouteSnapshot, detachedTree: DetachedRouteHandle): void {}
shouldAttach(route: ActivatedRouteSnapshot): boolean { return false; }
retrieve(route: ActivatedRouteSnapshot): DetachedRouteHandle|null { return null; }
shouldReuseRoute(future: ActivatedRouteSnapshot, curr: ActivatedRouteSnapshot): boolean {
let name = future.component && (<any>future.component).name;
return future.routeConfig === curr.routeConfig || name == "NavComponent";
}
}
@NgModule({
providers: [
{
provide: RouteReuseStrategy,
useClass: CustomReuseStrategy
}]
})
export class AppModule { }
这是您修改后的stackblitz,它将始终重用您的NavComponent
https://stackblitz.com/edit/angular-tj5nrm?file=app/app.module.ts
链接
角度路由器策略的默认值:https://github.com/angular/angular/blob/master/packages/router/src/route_reuse_strategy.ts
答案 1 :(得分:0)
我的意思是你需要的是嵌套的路由器插座。像这样:
<强> app.component.html:强>
<router-outlet></router-outlet>
<强>特征area.component.html:强>
<your-navbar-component></your-navbarcomponent>
<router-outlet></router-outlet>
儿童-的特征-area.component.html:强>
< h1>Hi there!</h1>
您-的Navbar-component.component.html:强>
< p>some links here...</p>
访问http://localhost:4200/feature-path/child-feature-path
时
你会得到:
这里有一些链接......
你好!
如果你需要,我可以用一个例子写一些插件来更好地解释。但我的意思是说你的路由器过载了一个可能不属于他的任务。