ルーティングは、URL リクエストを特定のコードにマッピングするメカニズムです。Web サイトのモジュール分割と情報アーキテクチャにおいて重要な役割を果たします。Angular のルーティング機能は非常に強力です。見てみましょう。 [関連チュートリアルの推奨事項: "angular チュートリアル"]
Angularルートに従って、対応するモジュール コードを動的にロードできます。 , この関数は、パフォーマンスを最適化するための強力なツールです。
ホームページのレンダリング速度を高速化するために、次のルーティングを設計して、ホームページをできるだけシンプルかつ新鮮に保つことができます:
const routes: Routes = [ { path: '', children: [ { path: 'list', loadChildren: () => import('./components/list/list.module').then(m => m.ListModule), }, { path: 'detail', loadChildren: () => import('./components/detail/detail.module').then(m => m.DetailModule), }, ... ], }, ];
ホームページには、いくつかの単純な静的要素のみがあります。一方、リスト、詳細、構成、その他のモジュールなどの他のページは、loadChildren
を使用して動的にロードされます。
結果は次のとおりです:
components-list-list-module-ngfactory.js
ファイルにのみアクセスできます。 when /list
はルーティング時にのみロードされます。
ルートにアクセスしたり切り替えたりすると、対応するモジュールとコンポーネントがロードされます。ルート ガードは、ルートのロード前後のフックとして理解できます。最も一般的なのはガードです。
たとえば、次のようにしたいとします。詳細ページに入る前にユーザーがアクセス権を持っているかどうかを判断するには、canActivate
ガードを使用できます。
{ path: 'detail', loadChildren: () => import('./components/detail/detail.module').then(m => m.DetailModule), // 路由守卫 canActivate: [AuthGuard], },
CLI コマンドを使用してルーティング ガード モジュールを作成します:
ng g guard auth
auth.guard.ts
import { Injectable } from '@angular/core'; import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree } from '@angular/router'; import { Observable } from 'rxjs'; import { DetailService } from './detail.service'; @Injectable({ providedIn: 'root' }) export class AuthGuard implements CanActivate { constructor( private detailService: DetailService, ) {} canActivate( route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree { return new Observable(observer => { // 鉴权数据从后台接口异步获取 this.detailService.getDetailAuth().subscribe((hasPermission: boolean) => { observer.next(hasPermission); observer.complete(); }); }); } }
権限サービスの取得:
ng g s detail
detail.service.ts
import {Injectable} from '@angular/core'; import { HttpClient } from '@angular/common/http'; @Injectable({ providedIn: 'root' }) export class DetailService { constructor( private http: HttpClient, ) { } getDetailAuth(): any { return this.http.get('/detail/auth'); } }
効果は次のとおりです:
/detail
ルートにガードを追加したため、他のルートから /detail
ルートに切り替える場合でも、/ に直接アクセスする場合でも、ガードを追加しました。詳細
ルート、このページにアクセスできません。
ルーティングにパラメータを導入するには、さまざまな方法があります。
{ path: 'user/:id', loadChildren: () => import('./components/user/user.module').then(m => m.UserModule), },
htmlパラメータの受け渡し
<a [routerLink]="['/list']" [queryParams]="{id: '1'}">...</a>
ts パラメータの受け渡し
this.router.navigate(['/list'],{ queryParams: { id: '1' });
注: データを介して渡されるルーティング パラメータは静的のみ可能です
{ path: 'detail', loadChildren: () => import('./components/detail/detail.module').then(m => m.DetailModule), // 静态参数 data: { title: '详情' } },
dataは静的パラメータしか渡せないので、バックグラウンドインターフェースから取得した動的パラメータをルーティングで渡したいのですがどうすればよいでしょうか?
答えは、resolve
構成によって決まります。
{ path: 'detail', loadChildren: () => import('./components/detail/detail.module').then(m => m.DetailModule), // 动态路由参数 resolve: { detail: DetailResolver }, },
detail.resolver.ts
import { Injectable } from '@angular/core'; import { Resolve, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; import { DetailService } from './detail.service'; @Injectable({ providedIn: 'root' }) export class DetailResolver implements Resolve<any> { constructor(private detailService: DetailService) { } resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): any { return this.detailService.getDetail(); } }
detail.service.ts
import {Injectable} from '@angular/core'; import { HttpClient } from '@angular/common/http'; @Injectable({ providedIn: 'root' }) export class DetailService { constructor( private http: HttpClient, ) { } getDetailAuth(): any { return this.http.get('/detail/auth'); } // 增加的 getDetail(): any { return this.http.get('/detail'); } }
コンポーネントの作成
ng g c detial
detail.component.ts
import { Component, OnInit } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; @Component({ selector: 'app-detail', templateUrl: './detail.component.html', styleUrls: ['./detail.component.scss'] }) export class DetailComponent implements OnInit { constructor( private route: ActivatedRoute, ) { } ngOnInit(): void { // 和获取静态参数的方式是一样的 const detail = this.route.snapshot.data.detail; console.log('detail:', detail); } }
プログラミング関連の知識の詳細については、次を参照してください: プログラミング ビデオ# ##! !
以上がAngular ルーティングにおける遅延読み込み、ガード、動的パラメーターの簡単な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。