javascript - Angular 2 : defining a Router on another Component than the bootstraped one

标签 javascript routing typescript angular

我仍在使用 Angular2 开发一个项目。 如果您想了解我为什么需要执行我将要解释的内容的更多详细信息,请参阅此 issue .

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

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

此组件包含另一个组件: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)));
    }
}

最后,MainComponent 包括 NavComponent,这是一个非常基本的导航。

问题是,使用此设置,我遇到了这个问题: 异常:组件“AppComponent”没有路由配置。在 [['Home'] in NavComponent@2:15] 中。

当然,如果我将路由器的逻辑移至 AppComponent,一切正常。

所以我的问题是:有没有一种方法可以将内容路由到另一个组件而不是引导组件?

谢谢 :).

最佳答案

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

这是显示错误的代码:

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.");
  }

  (...)
};

此方法是从 RouterLink 指令的 _updateLink 方法间接使用的。

这是相应的堆栈跟踪:

RouteRegistry._generate (router.js:2702)
RouteRegistry.generate (router.js:2669)
Router.generate (router.js:3174)
RouterLink._updateLink (router.js:1205)

查看我用来调试问题的插件:https://plnkr.co/edit/8JojtgZmc8kA9ib6zvKS?p=preview .

关于javascript - Angular 2 : defining a Router on another Component than the bootstraped one,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36330108/

相关文章:

javascript - 将对象转换为数组并将名称映射为键和子项

javascript - 在 webpack 中使用 html-webpack-plugin 和 string-replace-loader

ASP.NET 路由 : Literal sub-segment between tokens, 并使用文字子段中的字符路由值

html - 如何获取 "Angular2 for TypeScript"(测试版)中的 li-Element 以添加特定的 CSS 类?

javascript - 时刻格式详细日期作为日期对象

javascript - HTML 表单提交的两种不同操作

javascript - 画廊中可变宽度图像的滚动 block

ruby-on-rails - Hartl 的 ruby​​-on-rails 教程第 11 章删除微博时出现“无路线匹配”错误 - 完全难倒

java - 使用 SMTP 和 Apache Camel 向自己发送电子邮件

node.js - 如何使用 Promise.all 迭代对象键