Angular 2:在另一个组件上定义路由器而不是引导路由器

Clé*_*ops 5 javascript routing typescript angular

我还在使用Angular2进行项目.如果您想了解我需要做什么的更多详细信息,请参阅此问题.

我有一个AppComponent通过引导bootstrap.这是一个非常简单的组件:

@Component({
    selector: 'app-view',
    directives: [ Devtools, MainComponent ],
    template: `
        <ngrx-devtools></ngrx-devtools>
        <main-cmp></main-cmp>
    `
})
export class AppComponent { }
Run Code Online (Sandbox Code Playgroud)

该组件包括另一个组件:( MainComponent通过main-cmp选择器).出于某些原因,我想设置我的路由MainComponent.

这是代码:

@Component({ 
    selector: 'main-cmp',
    directives: [ ROUTER_DIRECTIVES, NavComponent ],
    template: `
        <h1>App</h1>
        <nav-cmp></nav-cmp>
        <router-outlet></router-outlet>
    `
})
@RouteConfig([
    { path: '/home',    name: 'Home',   component: HomeComponent,   useAsDefault: true },
    { path: '/medias',  name: 'Medias', component: MediasComponent }
])
export class MainComponent {
    constructor (private router:Router, private store:Store<AppStore>) {
        router.subscribe(url => store.dispatch(changeUrl(url)));
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,MainComponent包括NavComponent哪个是非常基本的导航.

问题是,通过这种设置,我遇到了这个问题: EXCEPTION: Component "AppComponent" has no route config. in [['Home'] in NavComponent@2:15].

当然,如果我将路由器的逻辑移动到AppComponent,一切都运行良好.

所以我的问题是:有没有办法将东西路由到另一个组件而不是引导的组件?

谢谢 :).

Thi*_*ier 3

看来这是不可能的,因为generate该类的方法RouteRegistry明确依赖(硬编码)根组件。请参阅源代码中的这一行:

这是引发错误的代码:

RouteRegistry.prototype._generate = function(linkParams,
         ancestorInstructions, prevInstruction, _aux, _originalLink) {
  (...)
  var parentComponentType = this._rootComponent; // <----
  (...)

  var rules = this._rules.get(parentComponentType);
  if (lang_1.isBlank(rules)) { // <----
    throw new exceptions_1.BaseException("Component \"" +
      lang_1.getTypeNameForDebugging(parentComponentType) +
      "\" has no route config.");
  }

  (...)
};
Run Code Online (Sandbox Code Playgroud)

该方法是从指令_updateLink的方法中间接使用的RouterLink

这是相应的堆栈跟踪:

RouteRegistry._generate (router.js:2702)
RouteRegistry.generate (router.js:2669)
Router.generate (router.js:3174)
RouterLink._updateLink (router.js:1205)
Run Code Online (Sandbox Code Playgroud)

请参阅我用来调试您的问题的plunkr:https://plnkr.co/edit/8JojtgZmc8kA9ib6zvKS ?p=preview 。