在Angular 4中使用嵌套的路由出口

9

我使用多个router-outlets来加载我的组件。 外部的router-outlet用于加载大多数基本组件,如登录、主页和404页面。 我使用嵌套的router-outlet来加载主页的子组件。这个router-outlet被嵌套在home.component中。

home.component.html

<app-header></app-header>
<router-outlet name="homeRoute"></router-outlet>
<app-footer></app-footer> 

app.module.ts

const appRoutes: Routes = [
  {path: '', component: HomeComponent, children: [
    {path: '', component: DashboardComponent, outlet: 'homeRouter'},
    {path: 'user', component: UserComponent, outlet: 'homeRouter'},
    {path: 'user/:id', component: UserdetailComponent, outlet: 'homeRouter'}
  ]},
  {path: 'login', component: LoginformComponent},
  {path: '**', component: NotfoundComponent}
];

HomeComponent和LoginformComponent需要从外部router-outlet加载。 Home组件包含名称为“homeRouter”的内部router-outlet,我想使用它来加载主页的子组件。 但是内部路由器的导航不起作用。我尝试使用router.navigate()方法和URL访问每个组件。但是两者都没有按预期工作。
有人能告诉我这段代码有什么问题吗?我检查并尝试了一些关于相同问题的先前问题,但都没有正常工作。
以下是我尝试不同组件的URL:
1. http://localhost:4200 dashboardComponet(这个可以工作) 2. http://localhost:4200/user userComponent(不起作用。路由到notFoundComponent) 3. http://localhost:4200/user/U001 userDetailComponent(不起作用。仍然路由到notFoundComponent)

有一个拼写错误 name="homeRoute" 应该是 outlet: 'homeRouter'。 - DrMabuse
1个回答

13

对于嵌套路由,您不需要为其命名router-outlet,您可以从路由中删除outlet: 'homeRouter'和从router-outlet中删除name="homeRoute",这样就可以生效了。

话虽如此,如果您需要多个router-outlet,以便可以随主要路由一起加载辅助路由,则router-oulet的名称应与outlet属性相同。在使用的路由中,您有outlet:"homeRouter"name="homeRoute",它们应该是相同的。

以下是带有多级嵌套路由的完整示例:

Plunker

import { Component, NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { ActivatedRoute, RouterModule, Routes } from '@angular/router';

@Component({
    selector: 'my-app',
    template: `<h1>Hello</h1>
  <a routerLink="/" >Home</a>
   <a routerLink="/admin" >Admin</a>
    <a routerLink="/nonexistingroute" >Non existing Route</a>
  <hr />
  <router-outlet></router-outlet>
  `
})
export class AppComponent {
}

@Component({
    template: `<h1>Home</h1>
   <a routerLink="/" >Dashboard</a>
    <a routerLink="/users" >Users</a>
  <hr />
   <router-outlet></router-outlet>
  `
})
export class HomeComponent { }

@Component({
    template: `<h1>Admin</h1>
  `
})
export class AdminComponent { }

@Component({
    template: `<h1>Dashboard</h1>
  `
})
export class DashboardComponent { }

@Component({
    template: `<h1>Users</h1>
  <a routerLink="user/1" >User 1</a>
  <a routerLink="user/2" >User 2</a>
  <hr />
   <router-outlet></router-outlet>
  `
})
export class Users { }

@Component({
    template: `<h1>User {{id}}</h1>
  `
})
export class UserdetailComponent {
    id = '';
    constructor(private readonly route: ActivatedRoute) {
        this.route.params.subscribe(params => {
            this.id = params.id;
        });
    }
}

@Component({
    template: `<h1>Not found</h1>
  `
})
export class NotfoundComponent { }

const appRoutes: Routes = [
    {
        path: '',
        component: HomeComponent,
        children: [
            { path: '', component: DashboardComponent },
            {
                path: 'users', component: Users,
                children: [
                    { path: 'user/:id', component: UserdetailComponent }
                ]
            }
        ]
    },
    {
        path: 'admin',
        component: AdminComponent
    },
    { path: '**', component: NotfoundComponent }
];

@NgModule({
    imports: [BrowserModule, RouterModule.forRoot(appRoutes)],
    declarations: [AppComponent, HomeComponent, AdminComponent, NotfoundComponent, DashboardComponent, Users, UserdetailComponent],
    bootstrap: [AppComponent]
})

export class AppModule { }


抱歉,我的问题有误。我从路由中删除了路由器名称和出口属性。现在我可以加载仪表板组件。但是其他组件无法加载。我该怎么办??? - LSampath
你正在尝试如何加载其他路由?你能否更新你的问题,包括同样的内容? - Madhu Ranjan
很高兴能够帮助,您可以接受这个答案。干杯! - Madhu Ranjan
1
但是,当我们尝试加载一个没有router-outlet名称和正确设置在app.module.ts中的组件时,路由器如何识别我们正在使用哪个router-outlet?我认为router-outlet充当了识别我们在尝试加载组件时所引用的哪个router-outlet的ID。你能否向我解释一下这个问题... - LSampath
1
Angular拥有非常有效的路由匹配逻辑,当我们加载路由时,它会创建一个分层路由器树,因此每当我们导航到一个路由时,它会加载相应的组件并检查router-outlet以加载嵌套路由。因此,在上面的示例中,它为空路径加载AppComponent,然后在outlet中再次加载HomeComponent,它看到router-outlet并发现有一个子空路由,所以它加载DashboardComponent。同样,当管理员URL被访问时,它会在第一级router-outlet中加载AdminComponent,因为它是第一级路由。干杯! - Madhu Ranjan
Plunker中存在脚本加载错误,请使用以下有效的Plunker链接: https://next.plnkr.co/edit/fv1pNwsnJc8yuhYi?preview - kirodge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接