【问题标题】:Issues with setting up child routes in Angular2在 Angular2 中设置子路由的问题
【发布时间】:2016-07-29 03:09:05
【问题描述】:

在尝试组织整个结构以便深入了解实际业务逻辑时,我遇到了以下问题。

我已经定义了路由的主控制器:

@Component({
  selector: 'priz-app',
  moduleId: module.id,
  templateUrl: './app.component.html',
  directives: [ROUTER_DIRECTIVES, SecureRouterOutlet, AppHeader],
  providers: [AuthenticationService]
})
@RouteConfig([
    { path: '/home', name: 'Home', component: HomeComponent, useAsDefault: true },
    { path: '/login', name: 'Login', component: LoginComponent },
    { path: '/logout', name: 'Logout', component: LogoutComponent },
    { path: '/rrm/...', name: 'Rrm', component: RrmMainComponent }
])

那个控制器的模板是:

<div class="container-fluid">
    <div class="row">
        <div class="col-md-12">
            <app-header></app-header>
            <secure-outlet signin="Login" unauthorized="AccessDenied"></secure-outlet>
        </div>
    </div>
</div>

如您所见,其中包含 app-header 指令,如下所示:

@Component({
    selector: 'app-header',
    moduleId: module.id,
    templateUrl: './app-header.component.html',
    directives: [Collapse, DROPDOWN_DIRECTIVES, ROUTER_DIRECTIVES, TrackScrollDirective]
})

在它的模板里面的某个地方:

<a [routerLink]="['RrmMain']">RRM <span class="sr-only">(current)</span></a>

RrmMainComponent 看起来像这样:

@Component({
    selector: 'rrm-main',
    moduleId: module.id,
    templateUrl: './rrm-main.component.html',
    directives: [ROUTER_DIRECTIVES, SecureRouterOutlet]
})

@RouteConfig([
    {path: '/', name: 'RrmMain', component: RrmMainComponent, useAsDefault: true, data: { roles:['ROLE_RRM_USER', 'ROLE_RRM_USER'] }}
])

一切都好,但我遇到了一个例外:

例外:路由器实例化期间出错! (路由器链接-> 路由器)。 angular2.js:23887 例外:实例化过程中出错 路由器! (RouterLink -> 路由器)。 angular2.js:23877:9

原始异常:“/”不允许子路由。使用“...” 父级的路由路径。

我尝试了任何我能想到的方法,但我被困在了这一点上。只是仍然没有足够的经验。

谢谢, 亚历克斯。

【问题讨论】:

  • 您是否在bootstrap() 中添加了ROUTER_PROVIDERS?你加&lt;script src="https://code.angularjs.org/2.0.0-beta.13/router.dev.js"&gt;&lt;/script&gt;了吗?你能创建一个 Plunker 来复制吗?
  • 是的,我确实做到了。如果我有单级路线,这一切都有效。至于plunker,我会尽力的,已经是相当大的代码了。
  • 请不要将所有代码添加到 Plunker,只添加重现问题所需的代码(最小可重现示例)。添加的代码越多,任何人尝试调试问题的可能性就越小。

标签: angular components router


【解决方案1】:

君特·佐赫鲍尔。

感谢您推动我创建 plunker。因为这让我意识到问题所在。

显然,在根路由配置的父级和子级路由中,我引用了相同的组件。 一旦我创建了这样的包装组件:

@Component({
    selector: 'rrm',
    moduleId: module.id,
    templateUrl: './rrm.component.html',
    directives: [ROUTER_DIRECTIVES, SecureRouterOutlet]
})

@RouteConfig([
    {path: '/', name: 'RrmMain', component: RrmMainComponent, useAsDefault: true, data: { roles:['ROLE_RRM_USER', 'ROLE_RRM_USER'] }}
])

注意,这里我链接的是另一个组件,而不是它本身。

并从应用组件中引用它:

{ path: '/rrm/...', name: 'Rrm', component: RrmComponent }

一切都像魅力一样!!!

谢谢,

【讨论】:

  • 指令列表中的SecureRouterOutlet 是什么?
  • 它是RouterOutlet的一个覆盖,它处理基于路由的授权:gist.github.com/ShurikAg/3c8afc05765cf1b5941b3cc3f81523df
  • @PardeepJain 它是route-outlet 类的扩展。通常,在到达 next or previous route 之前,先将一些自定义逻辑放在全局范围内,例如 authorization
猜你喜欢
  • 1970-01-01
  • 2017-03-26
  • 2016-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多