91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Angular路由中的懶加載、守衛、動態參數是什么意思

發布時間:2021-07-01 11:47:44 來源:億速云 閱讀:201 作者:chen 欄目: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動態加載。

效果如下:

Angular路由中的懶加載、守衛、動態參數是什么意思

其中的components-list-list-module-ngfactory.js文件,只有當訪問/list路由時才會加載。

路由守衛

當我們訪問或切換路由時,會加載相應的模塊和組件,路由守衛可以理解為在路由加載前后的鉤子,最常見的是進入路由的守衛和離開路由的守衛:

  • canActivate 進入守衛

  • canDeactivate 離開守衛

比如我們想在用戶進入詳情頁之前,判斷他是否有權限,就可以使用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();
      });
    });
  }
}

獲取權限service

獲取權限的service:

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');
  }
}

效果如下:

Angular路由中的懶加載、守衛、動態參數是什么意思

由于我們對/detail路由增加了守衛,不管是從別的路由切換到/detail路由,還是直接訪問/detail路由,都無法進入該頁面。

動態路由參數

在路由中帶參數有很多中方法:

  • 在path中帶參數

  • 在queryString中帶參數

  • 不通過鏈接帶參數

在path中帶參

{
  path: 'user/:id',
  loadChildren: () => import('./components/user/user.module').then(m => m.UserModule),
},

在queryString中帶參數

html傳參

<a [routerLink]="['/list']" [queryParams]="{id: '1'}">...</a>

ts傳參

this.router.navigate(['/list'],{ queryParams: { id: '1' });

通過data傳遞靜態參數

注意:通過data傳遞的路由參數只能是靜態的

{
  path: 'detail',
  loadChildren: () => import('./components/detail/detail.module').then(m => m.DetailModule),
  
  // 靜態參數
  data: {
    title: '詳情'
  }
},

通過resolve傳遞動態參數

data只能傳遞靜態參數,那我想通過路由傳遞從后臺接口獲取到的動態參數,該怎么辦呢?

答案是通過resolve配置。

{
  path: 'detail',
  loadChildren: () => import('./components/detail/detail.module').then(m => m.DetailModule),
  
  // 動態路由參數
  resolve: {
    detail: DetailResolver
  },
},

創建Resolver

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路由中的懶加載、守衛、動態參數是什么意思”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

晋中市| 灵丘县| 石屏县| 穆棱市| 来宾市| 凤台县| 普兰店市| 呼图壁县| 武汉市| 社会| 永新县| 山阳县| 连江县| 城固县| 诸暨市| 赤水市| 横山县| 乌鲁木齐市| 庆阳市| 中卫市| 南涧| 曲阳县| 客服| 沙河市| 乌鲁木齐县| 长治市| 宝鸡市| 杂多县| 溆浦县| 长兴县| 玛曲县| 长沙县| 当涂县| 惠水县| 新泰市| 河东区| 绥宁县| 穆棱市| 金阳县| 张家港市| 宜良县|