Angular 6子路由不起作用

Posted

技术标签:

【中文标题】Angular 6子路由不起作用【英文标题】:Angular 6 child routes not working 【发布时间】:2019-02-01 13:27:34 【问题描述】:

我有一个 angular 6 应用程序的简单导航,我试图在一个简单的配置中使路由和子路由工作,但不幸的是我似乎无法让它工作。

这是我的应用程序的结构

└───src
    ├───app
    │   ├───components
    │   │   ├───about
    │   │   ├───clients
    │   │   ├───footer
    │   │   ├───how-it-wo
    │   │   ├───partners
    │   │   ├───projects
    │   │   ├───team
    │   │   ├───whatwedo
    │   │   └───why-choos
    │   ├───layout
    │   │   └───main-layo
    │   └───shared
    ├───assets
    │   ├───charts
    │   ├───css
    │   ├───fonts
    │   ├───icon
    │   └───images
    └───environments

这里是路由,app.routing.module.ts

import  NgModule  from '@angular/core';
import  CommonModule  from '@angular/common';
import  RouterModule, Routes  from '@angular/router';
import  MainLayoutComponent  from './layout/main-layout/main-layout.component';
import  AboutComponent  from './components/about/about.component';
import  WhatwedoComponent  from './components/whatwedo/whatwedo.component';
import  ProjectsComponent  from './components/projects/projects.component';
import  FooterComponent  from './components/footer/footer.component';
const routes: Routes = [
  
    path: '',
    redirectTo: 'home',
    pathMatch: 'full'
  ,
  
    path: 'home',
    component: MainLayoutComponent,
    children: [
      
        path: 'about',
        component: AboutComponent
      ,
      
        path: 'what',
        component: WhatwedoComponent
      ,
      
        path: 'projects',
        component: ProjectsComponent
      ,
      
        path: 'contacts',
        component: FooterComponent
      
    ]
  
];


@NgModule(
  imports: [
    CommonModule,
    RouterModule.forRoot(routes),
  ],
  declarations: [],
  exports: [
    RouterModule
]
)
export class AppRoutingModule  

这里是html

<nav class="main-nav">
    <ul class="main-nav__list " ng-sticky [addClass]="'main-sticky-link'" [ngClass]="ref.click === true? 'Navbar__ToggleShow' :''">
          <li class="main-nav__item" routerLinkActive="active">
            <a class="main-nav__link" routerLink="/">Home</a>
          </li>
          <li class="main-nav__item" routerLinkActive="active">
            <a class="main-nav__link" routerLink="/home/about">About us</a>
          </li>
          <li class="main-nav__item" routerLinkActive="active">
            <a class="main-nav__link" routerLink="/home/what">What we do</a>
          </li>
          <li class="main-nav__item" routerLinkActive="active">
            <a class="main-nav__link" routerLink="/home/projects">Projects</a>
          </li>
          <li class="main-nav__item" routerLinkActive="active">
            <a class="main-nav__link" routerLink="/home/contacts">Contacts</a>
          </li>
        </ul>
</nav>
<div class="majeni-app">
  <app-whatwedo></app-whatwedo>
  <app-about></app-about>
  <app-projects></app-projects>
  <app-why-choose-us></app-why-choose-us>
  <app-team></app-team>
  <app-footer></app-footer>
</div>

UPDATE 这里是 gitbuh repo 供参考 https://github.com/gruby-murzyn/agency/tree/master/majeni

当我点击关于我们的例子时,什么都没有发生,但浏览器上的 url 看起来还不错

http://localhost:4200/home/about

我的代码做错了什么?

【问题讨论】:

@Nico 这里是github的链接github.com/gruby-murzyn/agency/tree/master/majeni &lt;router-outlet&gt;&lt;/router-outlet&gt; 在哪里?尝试在 html 中添加它 在 app.component.html 中,这里是 github 中的应用链接github.com/gruby-murzyn/agency/tree/master/majeni 你在 app.module.ts 中有错误的导入使用 import AppRoutingModule from './app-routing.module'; 而不是 import AppRoutingModule from './/app-routing.module'; 【参考方案1】:

当您在路由中使用 children 时,父组件需要在其 html 中包含 &lt;router-outlet&gt;&lt;/router-outlet&gt; 才能将子组件加载到该父组件中。 Angular Docs on Child Configuration

此外,对于 routed 组件,无需在父组件的 html 中添加组件选择器,因为它们将由您的 router-outlet 下方的路由器自动注入。

所以你在你的情况下改变你的 最后显示的 div:

<div class="majeni-app">
 <router-outlet></router-outlet>
<!-- All children will be inserted here -->
  <app-footer></app-footer>
</div>

或者你在 html 中的选择器不是路由组件,应该显示在每个子组件上 然后只需将router-outlet 添加到特定位置

<div class="majeni-app">
  <app-whatwedo></app-whatwedo>
  <app-about></app-about>
  <app-projects></app-projects>
  <app-why-choose-us></app-why-choose-us>
  <app-team></app-team>
  <router-outlet></router-outlet>
  <!-- All children will be loaded here -->
  <app-footer></app-footer>
</div>

【讨论】:

你的兄弟,你可以看到你的方法只显示页眉和页脚,但我希望在应用程序上线时显示所有内容,当用户点击我们或我们的项目或联系人时,应该只是向下滚动到关于我们部分或项目或联系人等,是否有可能实现?如果有怎么办? 在您编辑完答案后,所有内容都已加载,但是当我单击例如关于我们时,页面不会向下滚动到关于我们部分,是否可以实现? 当您导航到任何页面时会发生什么?它是滚动到顶部还是滚动位置保持不变? 什么都不做兄弟,我想要这样的东西angular-landing.mhrafi.com/home/one 尝试点击任何导航链接,你会看到会发生什么 我不知道为什么我错过了这个细节,但我从来不知道子路由的输出必须进入父组件。这是我第一次看到它的实际解释。不过,这很有意义!

以上是关于Angular 6子路由不起作用的主要内容,如果未能解决你的问题,请参考以下文章

条件路由在 Angular 应用程序中不起作用

Angular2嵌套路由父到子ES5不起作用

Angular 6.0.3 HTML 组件选择器不起作用

Angular 4路由不起作用

Angular 8嵌套路由和多个路由器插座不起作用

Angular 11,js在角度路由后不起作用