8

我目前的配置:

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每次位置更改时都会销毁并重新创建实例 from(c)(a)。这是我需要防止的事情。我需要保留我的实例,因为它的状态、动画等。据我所知,只有当所有 URL 都使用相同的路由时才有可能,但是我找不到这样做的方法。如果我删除(1),像这样的 URL将(c)停止显示NavComponentnav. 显然**与此类 URL 不匹配(但我不确定为什么)。

你可以在这里看到它的实际效果:https ://stackblitz.com/edit/angular-ptzwrm

这里的正确解决方案是什么?

现在,我像在解析UrlSerializer之前一样添加(nav:)到 URL(c)中,但感觉就像是 hack。

4

2 回答 2

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 ://medium.com/@gerasimov.pk/how-to-reuse-rendered-component-in-angular-2-3-with-routereusestrategy-64628e1ca3eb

角度路由器策略的默认值:https ://github.com/angular/angular/blob/master/packages/router/src/route_reuse_strategy.ts

于 2018-02-17T09:50:52.920 回答
0

我的意思是你需要的是一个嵌套的路由器插座。像这样的东西:

app.component.html: <router-outlet></router-outlet>

功能区.component.html: <your-navbar-component></your-navbarcomponent> <router-outlet></router-outlet>

子功能area.component.html: < h1>Hi there!</h1>

你的导航栏component.component.html: < p>some links here...</p>

当您访问时,http://localhost:4200/feature-path/child-feature-path 您将获得:

这里有一些链接...

你好呀!

如果你需要,我可以写一些 pluker 和一个例子来更好地解释。但是我的意思是,您正在使路由器超载执行一项可能不适合他的任务。

于 2018-02-16T11:18:32.927 回答