【问题标题】:Angular2 Router: Error: Cannot find primary outlet to load 'InboxComponent'Angular2 路由器:错误:找不到加载“InboxComponent”的主要出口
【发布时间】:2017-06-10 10:03:09
【问题描述】:

我创建了一个带有路由的简单应用。 链接“http://localhost:4200”和“http://localhost:4200/mail”运行良好,

但是当我尝试打开链接“http://localhost:4200/mail/inbox”时,我收到错误消息:“无法找到加载'InboxComponent'的主要出口”。 p>

导致错误的原因以及如何解决?

这是我的 *.ts 文件:

app.module.ts

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';
import { RouterModule } from '@angular/router';

import { AppComponent } from './app.component';
import { MailListComponent } from './components/mail-list/mail-list.component';
import { FoldersComponent } from './components/folders/folders.component';
import { InboxComponent } from './components/inbox/inbox.component';

const routes = [
  { path: '',
    component: MailListComponent
   },

  { path: 'mail', component: MailListComponent,
      children: [
        {path: 'inbox', component: InboxComponent}
      ]
  }
];

@NgModule({
  declarations: [
    AppComponent,
    MailListComponent,
    FoldersComponent,
    InboxComponent
  ],
  imports: [
    BrowserModule,
    FormsModule,
    HttpModule,
    RouterModule.forRoot(routes)
  ],
  bootstrap: [AppComponent]
})
export class AppModule { }

app.component.ts

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

@Component({
  selector: 'app-root',
  template: `
    <app-folders></app-folders>
    <router-outlet></router-outlet>
  `,
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'app works!';
}

folders.component.ts

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

@Component({
  selector: 'app-folders',
  template: `
    <aside class="folders">
      <ul>
        <li><a routerLink="mail/inbox">Inbox</a></li>
      </ul>
    </aside>
  `,
  styleUrls: ['./folders.component.css']
})
export class FoldersComponent {
  folders: any[];

  constructor() { }

}

ma​​il-list.component.ts

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

@Component({
  selector: 'app-mail-list',
  template: `
    <p>
      Mail list works!
    </p>
  `,
  styleUrls: ['./mail-list.component.css']
})
export class MailListComponent {

  constructor() { }

}

inbox.component.ts

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

@Component({
  selector: 'app-inbox',
  template: `
    <p>
      inbox works!
    </p>
  `,
  styleUrls: ['./inbox.component.css']
})
export class InboxComponent implements OnInit {

  constructor() { }

  ngOnInit() {
  }

}

【问题讨论】:

标签: angular typescript angular2-routing angular2-router


【解决方案1】:

如果您想避免添加&lt;router-outlet&gt;&lt;/router-outlet&gt;,另一种方法是将您定义路由的方式更改为以下内容:

const routes = [
  { path: '',
    children: [
      {
        path: '',
        component: MailListComponent
      }
    ]
  },
  { path: 'mail', 
    children: [
      {
        path: '',
        component: MailListComponent
      },
      {
        path: 'inbox', 
        component: InboxComponent
      }
    ]
  }
];

这将允许您使用与上述相同的&lt;router-outlet&gt;&lt;/router-outlet&gt; 来托管新组件

【讨论】:

    【解决方案2】:

    您的MailListComponent 也需要&lt;router-outlet&gt;,因为InboxComponent 在您的路由器配置中被定义为子级:

    @Component({
      selector: 'app-mail-list',
      template: `
        <p>
          Mail list works!
        </p>
        <router-outlet></router-outlet>
      `,
      styleUrls: ['./mail-list.component.css']
    })
    export class MailListComponent {
    
      constructor() { }
    
    }
    

    但是,如果您想在同一个插座中呈现 InboxComponent,则不应将其添加为子项

    【讨论】:

    • 非常感谢!这是许多真正帮助我的唯一答案。但是,我不知道 Angular 如何确定该组件是子组件(我没有像作者那样的子路由,并且 Angular 仍然出于某种原因认为它是子组件)。有什么想法可以在哪里找到这种关系的配置?
    • 你确实有一个子路由,因为 inboxchildren 数组中 mail :)
    猜你喜欢
    • 2023-03-06
    • 2016-11-08
    • 1970-01-01
    • 2016-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    • 1970-01-01
    相关资源
    最近更新 更多