我还在使用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
这是一个非常基本的导航。
问题是,通过此设置,我遇到了这个问题:
EXCEPTION: Component "AppComponent" has no route config. in [['Home'] in NavComponent@2:15]
。
当然,如果我将路由器的逻辑移到AppComponent
,一切运行良好。
所以我的问题是:有没有办法将东西路由到另一个组件而不是引导组件?
谢谢:)。
答案 0 :(得分: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.");
}
(...)
};
此方法是从_updateLink
指令的RouterLink
方法间接使用的。
这是相应的堆栈跟踪:
RouteRegistry._generate (router.js:2702)
RouteRegistry.generate (router.js:2669)
Router.generate (router.js:3174)
RouterLink._updateLink (router.js:1205)
请参阅我用于调试问题的plunkr:https://plnkr.co/edit/8JojtgZmc8kA9ib6zvKS?p=preview。
答案 1 :(得分:0)
解决方法怎么样 - 使用root作为子路由?
@Component({
selector: 'app',
directives: [ ROUTER_DIRECTIVES ],
template: `
<router-outlet></router-outlet>
`
})
@RouteConfig([
{path: '/...', as: 'Main', component: MainComponent, useAsDefault: true }
])
export class App { }
@Component({
selector: 'main-cmp',
directives: [ ROUTER_DIRECTIVES ],
template: `
<h1>App</h1>
<router-outlet></router-outlet>
`
})
@RouteConfig([
{ path: '/home', name: 'Home', component: HomeComponent, useAsDefault: true },
])
export class MainComponent { }