6

我正在尝试在主路由器插座内使用辅助路由器插座。

应用程序路由

export const appRoutes: Routes = [
    { path: '', component: HomeComponent },
    {
        path: 'page',
        loadChildren: () => new Promise(function (resolve) {
            (require as any).ensure([], function (require: any) {
                resolve(require('../pages/page.module').default);
            });
        })
    }
];

应用程序组件

@Component({
    template: `<h1>My App!</h1>
        <a [routerLink]="['/page']">Page</a>
        <router-outlet></router-outlet>`
})

页面模块

@NgModule({
    imports: [
        CommonModule,
        RouterModule.forChild([
            {
                path: '',
                component: PageComponent
            },
            {
                path: 'auxpath',
                component: AuxComponent,
                outlet: 'auxoutlet'
            }
        ])
    ],
  declarations: [PageComponent],
  exports: [PageComponent]
})
export default class PageModule {}

页面组件

@Component({
    template: `Page <router-outlet name="auxoutlet"></router-outlet>`
})

辅助组件

@Component({
    template: `Aux`
})

错误 /page/(auxoutlet:auxpath)将看到页面组件,但出现此错误:

EXCEPTION: Uncaught (in promise): Error: Cannot find the outlet auxoutlet to load 'AuxComponent'
4

2 回答 2

16

我尝试使用延迟加载和命名路由器插座,发现以下事实:

  1. 辅助路线必须是路径不是父路线的子路线''。他们不会作为空路径路线的孩子工作。它可能很快就会修复。
  2. 辅助路由在父路由中被隔离。它们的匹配规则与标准 Angular 路由规则完全不同。
  3. 如果我们延迟加载带有辅助路由的模块,我们需要将默认的空路径路由重定向到具有非空路径的路由,该路由具有包含命名的组件,<router-outlet>其子路由将是辅助路由和其他子路由。(它可能很快就会修复,与第 1 点相同。)
  4. 您可以通过以下方式加载命名的插座:url(parentRoute/outletName:['outletPath', param]),或使用路由器链接指令([routerLink]=['parentRoutes',{outlets: {outletName:['outletPath', param]}}],或以编程方式(this.router.navigate(['parentRoutes',{outlets: {outletName:['outletPath', param]}}]

  5. 要删除命名出口,outlets: {outletName: null}请在 url、routerLink 或代码中指定。

  6. 由于一个错误(将空路径子路径重定向到命名路由不起作用),目前没有优雅的方法来默认加载命名路由并能够在以后使用上述方法将其删除。它可能很快就会修复。但是,您可以有一个带有虚拟组件的空路径,并在其构造函数中导航到加载默认命名路由的 URL。或者您可以在父组件中执行此操作。

特别感谢布兰登

于 2016-12-02T12:48:39.140 回答
6

我使用此路由配置解决了:

RouterModule.forChild([
  {
    path: 'wrap',
    component: PageComponent,
    children: [
      {
        path: 'auxpath',
        component: AuxComponent,
        outlet: 'auxoutlet'
      }
    ]
  },

  {
    path: '',
    component: PageComponent
  }
])

此网址有效:

/page/wrap/(auxoutlet:auxpath) 
于 2016-10-07T13:14:56.320 回答