Angular2路由器错误:无法找到主插座加载'HomePage'

Dav*_*vid 77 router angular

我刚开始使用新的路由库(@ angular/router v3.0.0-alpha.7),但是遵循官方文档会导致以下错误:

browser_adapter.ts:74: EXCEPTION: Error: Uncaught (in promise): Error: Cannot find primary outlet to load 'HomePage'
Run Code Online (Sandbox Code Playgroud)

问题是 - 如何摆脱错误并使路由器按预期运行?我错过了一个设置吗?

(使用alpha.6版本时会出现相同的错误.)

app.component.ts

import { Component } from '@angular/core';
import { ROUTER_DIRECTIVES } from '@angular/router';

@Component({
    selector: 'app',
    template: `
        <p>Angular 2 is running...</p>
        <!-- Routed views go here -->
        <router-outlet></router-outlet>
    `,
    providers: [ROUTER_DIRECTIVES]
})
export class AppComponent {
}
Run Code Online (Sandbox Code Playgroud)

app.routes.ts

import { provideRouter, RouterConfig } from '@angular/router';
import { HomePage } from './pages/home/home';

export const routes: RouterConfig = [
    { path: '', component: HomePage }
];

export const APP_ROUTER_PROVIDERS = [
    provideRouter(routes)
];
Run Code Online (Sandbox Code Playgroud)

home.ts

import { Component } from '@angular/core';

@Component({
    template: '<h1>Home Page</h1>'
})
export class HomePage {
}
Run Code Online (Sandbox Code Playgroud)

main.ts

/* Avoid: 'error TS2304: Cannot find name <type>' during compilation */
///<reference path="../../typings/index.d.ts" />

import { bootstrap } from "@angular/platform-browser-dynamic";
import { APP_ROUTER_PROVIDERS } from './app.routes';
import { AppComponent } from "./app.component";

bootstrap(AppComponent, [
    APP_ROUTER_PROVIDERS,
]).catch(err => console.error(err));
Run Code Online (Sandbox Code Playgroud)

Mar*_*cok 85

虽然@JS_astronauts已经提供了解决方案,但我认为解释错误是有益的...

当Angular解析HTML模板并找到指令RouterOutlet时,即当它找到RouterOutlet的选择器时,设置主要插座:<router-outlet></router-outlet>.

虽然您的模板确实包含<router-outlet></router-outlet>,但您的组件不包含directives: [ROUTER_DIRECTIVES],因此Angular不会查找该常量定义的任何指令:

export const ROUTER_DIRECTIVES = [RouterOutlet, RouterLink, RouterLinkWithHref, 
 RouterLinkActive];
Run Code Online (Sandbox Code Playgroud)

因此,当Angular解析AppComponent的HTML模板时,如果它不能识别,<router-outlet></router-outlet>那么它就会忽略它.稍后,当Angular尝试渲染默认路由组件(HomePage)时,它会抱怨因为不知道放在哪里.


如果元素选择器中有拼写错误,也会发生此错误,例如:

<roter-outlet></roter-outlet>
Run Code Online (Sandbox Code Playgroud)

在这种情况下,即使您的directives数组设置正确,Angular也永远不会找到所需的<router-outlet>元素.


KB_*_*KB_ 71

您在" app.component.ts 看起来"中出现错误,就像您在providers数组中声明了一个指令一样.

import { Component } from '@angular/core';
import { ROUTER_DIRECTIVES } from '@angular/router';

@Component({
    selector: 'app',
    template: `
        <p>Angular 2 is running...</p>
        <!-- Routed views go here -->
        <router-outlet></router-outlet>
        `,
     directives: [ROUTER_DIRECTIVES] //here
})
export class AppComponent {
}
Run Code Online (Sandbox Code Playgroud)

  • 当我添加`<router-outlet> </ router-outlet>`时,我的错误得到了解决.即使我在@Component部分没有`指令:[ROUTER_DIRECTIVES]`,也不会出错. (3认同)

mic*_*yks 7

它应该是,directives metadata而不是providers,

directives: [ROUTER_DIRECTIVES]
Run Code Online (Sandbox Code Playgroud)