routing & lazy loading 設定 - slioplark/angular-tutorial GitHub Wiki

新增 routing module

ng g m app --routing  
ng g m layout --routing

設定 lazy loading 對應的 module

透過 loadChildre 屬性的 import 與 then 方法,使 angular 知道什麼 route 可以載入對應的 module。

  • import:設定載入 module 的路徑
  • then:設定載入的 module

lazy loading 的功能是當 angular 進入某個 component 後,才會開始載入「所需的 module」,而不是在 angular 運行完成後,便載入「所有」會使用到的 module。這對 browser 來說可減輕一開始就載入大量資源的負擔。

const routes: Routes = [
  {
    path: 'layout',
    loadChildren: () => import('./layout/layout.module').then(m => m.LayoutModule)
  }
];
@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }

設定 route 對應的 component

當 path 為 content 時,angular 才會創建 ContentComponent

const routes: Routes = [
  { path: 'content', component: ContentComponent }
];

@NgModule({
  imports: [RouterModule.forChild(routes)],
  exports: [RouterModule]
})
export class LayoutRoutingModule { }

設定 nested routes

若 route 為多層結構的話,可使用 children 方法設定下一層 route。

const routes: Routes = [
  {
    path: 'content',
    component: ContentComponent,
    children: [
      {
        path: 'layout',
        loadChildren: () => import('./layout/layout.module').then(m => m.LayoutModule)
      }
    ]
  }
];

@NgModule({
  imports: [RouterModule.forChild(routes)],
  exports: [RouterModule]
})
export class LayoutRoutingModule { }

載入路由 module

在 LayoutModule 載入已設定完成的路由 module,如 LayoutRoutingModule

@NgModule({
  imports: [
    LayoutRoutingModule
  ],
})
export class LayoutModule { }

加入 router-outlet 標籤

angular 會依據「路由」將對應的 component 的 html 取代 router-outlet 標籤

<router-outlet></router-outlet>

設定 routerLink

引入 RouterModule

@NgModule({
  imports: [
    RouterModule
  ],
  exports: [
    RouterModule
  ]
})
export class SharedModule { }

在標籤上加入 routerLink,並「點擊」進行路由切換

<a routerLink="/">Home</a>