【问题标题】:Using nested router-outlets in angular 4在角度 4 中使用嵌套的路由器插座
【发布时间】:2018-03-07 18:12:36
【问题描述】:

我正在使用多个路由器出口来加载我的组件。 外部路由器插座用于加载最基本的组件,如登录、家庭、404。 我使用嵌套的路由器插座来加载主页的子组件。该路由器插座嵌套在 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 需要从外部路由器出口加载。 Home 组件包含名为“homeRouter”的内部路由器插座,我想用它来加载主页的子组件。 但是内部路由器的导航不起作用。我尝试使用 router.navigate() 方法和 URL 访问每个组件。但是两者都没有按预期工作。

谁能告诉我这段代码有什么问题。我检查并尝试了几个关于同一问题的先前问题,但没有一个工作正常。

这是我为不同组件尝试过的 URL

  1. http://localhost:4200dashboardComponet(这个有效)
  2. http://localhost:4200/user userComponent(不起作用。路由到 notFoundComponent)
  3. http://localhost:4200/user/U001 userDetailComponent(不工作。仍然路由到 notFoundComponent)

【问题讨论】:

  • 有一个错字 name="homeRoute" 出口:'homeRouter'

标签: angular angular2-routing nested-routes router-outlet


【解决方案1】:

你不需要为嵌套路由命名 router-outlet,你可以从 Routes 中删除 outlet: 'homeRouter' 并从 router-outlet 中删除 name="homeRoute" ,它应该可以工作。

话虽如此,如果您需要多个路由器出口,以便您可以加载辅助路由和主路由,router-oulet 的名称应该与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 { }

【讨论】:

  • 对不起。这是我的问题的一个错误。我从路由中删除了路由器名称和插座属性。现在我可以加载仪表板组件。但无法加载其他组件。我该怎么办???
  • 你如何尝试加载其他路线,你能用同样的方式更新你的问题吗?
  • 很高兴,我能帮上忙,您可以接受答案。干杯!!
  • 但是当我们尝试在 app.module.ts 中正确加载没有路由器出口名称和出口的组件时,路由器如何识别我们正在使用的路由器出口。我认为当我们尝试加载组件时,路由器插座充当了识别我们所指的路由器插座的 ID。你能给我解释一下吗...
  • Angular 有一个非常有效的路由匹配逻辑,当我们加载路由时它会创建一个分层路由树,所以当我们导航到一个路由时,它会加载相应的组件并检查路由器出口以加载嵌套路线,所以在上面的例子中,它为空路径加载AppComponent,然后在出口中再次加载HomeComponent,它看到router-outlet并发现有一个子空路径,所以它加载DashboardComponent。同样,当 admin url 被点击时,它会在第一级 router-outlet 中加载AdminComponent,因为它是第一级路由。干杯!!
猜你喜欢
  • 2018-08-18
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 2020-05-16
  • 1970-01-01
  • 2018-11-29
  • 1970-01-01
  • 2020-10-23
相关资源
最近更新 更多