目錄
你為什麼應該使用Resolver
在應用程式中使用 Resolver
創建服務並編寫邏輯獲取列表資料
怎麼應用一個預先載入導航
总结
首頁 web前端 js教程 聊聊Angular Route中怎麼提前取得數據

聊聊Angular Route中怎麼提前取得數據

Jul 13, 2022 pm 08:00 PM
angular

Angular Route中怎麼提前取得數據?以下這篇文章為大家介紹一下從 Angular Route 提前取得數據的方法,希望對大家有幫助!

聊聊Angular Route中怎麼提前取得數據

提前取得意味著在資料呈現在螢幕之前取得到資料。本文中,你將學到,在路由更改前怎麼取得到資料。透過本文,你將學會使用 resolver, 在 Angular App 中應用 resolver,應用到一個公共的預先載入導航。 【相關教學推薦:《angular教學》】

你為什麼應該使用Resolver

Resolver 在路由跟元件之間扮演中間件服務的角色。假設你有一個表單,沒有資料時,你想要向使用者一個空的表單,當在載入使用者資料時展示一個loader,然後當資料回傳時,填入表單並隱藏loader

通常,我們都會在元件的 ngOnInit() 鉤子函數中取得資料。也就是說,元件載入完之後,我們發起資料請求。

ngOnInit() 中操作,我們需要在每個需要的元件載入後,在其路由頁面中新增 loader 展示。 Resolver 可以簡化 loader 的新增使用。你可以只新增一個適用於每個路由的 loader,而不是每個路由都新增 loader

本文將結合範例來解析 resolver 的知識點。以便於你可以牢記它並在專案中使用它。

在應用程式中使用 Resolver

為了在應用程式中使用 resolver,你需要準備一些介面。你可以透過 JSONPlaceholder 來模擬,而不需要自己開發。

JSONPlaceholder 是一個很棒的介面資源,你可以藉助它來更好地學習前端的相關概念而不被介面所約束。

現在,介面的問題解決了,我們可以開始 resolver 的應用了。一個 resolver 是一個中間件服務,所以我們將建立一個服務。

$ ng g s resolvers/demo-resolver --skipTests=true
登入後複製

--skipTests=true 跳過生成測試檔案

#src/app/resolvers 資料夾中建立了一個服務。 resolver 介面中有一個resolve() 方法,它有兩個參數:routeActivatedRouteSnapshot 的實例)和 state(RouterStateSnapshot 的實例)。

loader 通常是在ngOnInit() 中寫所有的AJAX 請求,但是邏輯將會在resolver中實現,替代ngOnInit()

接著,建立一個服務來取得 JSONPlaceholder 中列表資料。然後在 resolver 中底調用,接著在路由中配置 resolve訊息,(頁面將會等待)直到 resolver 被處理。在 resolver 被處理之後,我們可以透過路由來取得資料然後展示在元件中。

創建服務並編寫邏輯獲取列表資料

$ ng g s services/posts --skipTests=true
登入後複製

現在,我們成功創建了服務,是時候編寫一個AJAX 請求的邏輯了。

model 的使用能夠幫助我們減少錯誤。

$ ng g class models/post --skipTests=true
登入後複製

post.ts

export class Post {  id: number;
  title: string;
  body: string;
  userId: string;
}
登入後複製

model 就緒,是時候取得貼文 post 的資料了。

post.service.ts

import { Injectable } from "@angular/core";
import { HttpClient } from "@angular/common/http";
import { Post } from "../models/post";

@Injectable({
  providedIn: "root"
})
export class PostsService {
  constructor(private _http: HttpClient) {}

  getPostList() {
    let URL = "https://jsonplaceholder.typicode.com/posts";
    return this._http.get<Post[]>(URL);
  }
}
登入後複製

現在,這個服務隨時可被呼叫。

demo-resolver.service.ts

import { Injectable } from "@angular/core";
import {
  Resolve,
  ActivatedRouteSnapshot,
  RouterStateSnapshot
} from "@angular/router";
import { PostsService } from "../services/posts.service";

@Injectable({
  providedIn: "root"
})
export class DemoResolverService implements Resolve<any> {
  constructor(private _postsService: PostsService) {}

  resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
    return this._postsService.getPostList();
  }
}
登入後複製

貼文清單資料從 resolver 傳回。現在,你需要一個路由去設定 resolver,從路由取得數據,然後讓數據展示在元件中。為了進行路由跳轉,我們需要建立一個元件。

$ ng g c components/post-list --skipTests=true
登入後複製

為了路由可見,在 app.component.ts 新增 router-outlet

<router-outlet></router-outlet>
登入後複製

現在,你可以設定 app-routing.module.ts 檔案了。下面的片段程式碼將有助於你理解路由配置 resolver

app-routing-module.ts

import { NgModule } from "@angular/core";
import { Routes, RouterModule } from "@angular/router";
import { PostListComponent } from "./components/post-list/post-list.component";
import { DemoResolverService } from "./resolvers/demo-resolver.service";

const routes: Routes = [
  {
    path: "posts",
    component: PostListComponent,
    resolve: {
      posts: DemoResolverService
    }
  },
  {
    path: "",
    redirectTo: "posts",
    pathMatch: "full"
  }
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule {}
登入後複製

一個resolve 已經加入到路由配置中了,它將發起一個HTTP 請求,然後當HTTP 請求成功返回後,允許元件初始化。路由將組裝取得到的 HTTP 請求傳回的資料。

怎麼應用一個預先載入導航

向使用者展示一個請求正在進行,我們在AppComponent 中寫一個公共且簡單的loader。你可以根據需要自訂。

app.component.html

Loading...
<router-outlet></router-outlet>
登入後複製

app.component.ts

import { Component } from "@angular/core";
import {
  Router,
  RouterEvent,
  NavigationStart,
  NavigationEnd
} from "@angular/router";

@Component({
  selector: "app-root",
  templateUrl: "./app.component.html",
  styleUrls: ["./app.component.scss"]
})
export class AppComponent {
  isLoader: boolean;

  constructor(private _router: Router) {}

  ngOnInit() {
    this.routerEvents();
  }

  routerEvents() {
    this._router.events.subscribe((event: RouterEvent) => {
      switch (true) {
        case event instanceof NavigationStart: {
          this.isLoader = true;
          break;
        }
        case event instanceof NavigationEnd: {
          this.isLoader = false;
          break;
        }
      }
    });
  }
}
登入後複製

当导航开始,isLoader 值被赋予 true,页面中,你将看到下面的效果。

聊聊Angular Route中怎麼提前取得數據

resolver 处理完之后,它将会被隐藏。

现在,是时候从路由中获取值并将其展示出来。

port-list.component.ts

import { Component, OnInit } from "@angular/core";
import { Router, ActivatedRoute } from "@angular/router";
import { Post } from "src/app/models/post";

@Component({
  selector: "app-post-list",
  templateUrl: "./post-list.component.html",
  styleUrls: ["./post-list.component.scss"]
})
export class PostListComponent implements OnInit {
  posts: Post[];

  constructor(private _route: ActivatedRoute) {
    this.posts = [];
  }

  ngOnInit() {
    this.posts = this._route.snapshot.data["posts"];
  }
}
登入後複製

如上所示,post 的值来自 ActivatedRoute 的快照信息 data。这值都可以获取,只要你在路由中配置了相同的信息。

我们在 HTML 进行如下渲染。

<div class="post-list grid-container">
  <div class="card" *ngFor="let post of posts">
    <div class="title"><b>{{post?.title}}</b></div>
    <div class="body">{{post.body}}</div>
  </div>
</div>
登入後複製

CSS 片段样式让其看起来更美观。

port-list.component.css

.grid-container {
  display: grid;
  grid-template-columns: calc(100% / 3) calc(100% / 3) calc(100% / 3);
}
.card {
  margin: 10px;
  box-shadow: black 0 0 2px 0px;
  padding: 10px;
}
登入後複製

推荐使用 scss 预处理器编写样式

从路由中获取数据之后,它会被展示在 HTML 中。效果如下快照。

聊聊Angular Route中怎麼提前取得數據

至此,你已经了解完怎么应用 resolver 在你的项目中了。

总结

结合用户体验设计,在 resolver 的加持下,你可以提升你应用的表现。了解更多,你可以戳官网

本文是译文,采用的是意译的方式,其中加上个人的理解和注释,原文地址是:

https://www.pluralsight.com/guides/prefetching-data-for-an-angular-route

更多编程相关知识,请访问:编程视频!!

以上是聊聊Angular Route中怎麼提前取得數據的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

聊聊Angular中的元資料(Metadata)和裝飾器(Decorator) 聊聊Angular中的元資料(Metadata)和裝飾器(Decorator) Feb 28, 2022 am 11:10 AM

這篇文章繼續Angular的學習,帶大家了解Angular中的元數據和裝飾器,簡單了解一下他們的用法,希望對大家有幫助!

如何在Ubuntu 24.04上安裝Angular 如何在Ubuntu 24.04上安裝Angular Mar 23, 2024 pm 12:20 PM

Angular.js是一種可自由存取的JavaScript平台,用於建立動態應用程式。它允許您透過擴展HTML的語法作為模板語言,以快速、清晰地表示應用程式的各個方面。 Angular.js提供了一系列工具,可協助您編寫、更新和測試程式碼。此外,它還提供了許多功能,如路由和表單管理。本指南將討論在Ubuntu24上安裝Angular的方法。首先,您需要安裝Node.js。 Node.js是一個基於ChromeV8引擎的JavaScript運行環境,可讓您在伺服器端執行JavaScript程式碼。要在Ub

angular學習之詳解狀態管理器NgRx angular學習之詳解狀態管理器NgRx May 25, 2022 am 11:01 AM

這篇文章帶大家深入了解angular的狀態管理器NgRx,介紹一下NgRx的使用方法,希望對大家有幫助!

一文探究Angular中的服務端渲染(SSR) 一文探究Angular中的服務端渲染(SSR) Dec 27, 2022 pm 07:24 PM

你知道 Angular Universal 嗎?可以幫助網站提供更好的 SEO 支援哦!

Angular + NG-ZORRO快速開發一個後台系統 Angular + NG-ZORRO快速開發一個後台系統 Apr 21, 2022 am 10:45 AM

這篇文章跟大家分享一個Angular實戰,了解一下angualr 結合 ng-zorro 如何快速開發一個後台系統,希望對大家有幫助!

如何使用PHP和Angular進行前端開發 如何使用PHP和Angular進行前端開發 May 11, 2023 pm 04:04 PM

隨著網路的快速發展,前端開發技術也不斷改進與迭代。 PHP和Angular是兩種廣泛應用於前端開發的技術。 PHP是一種伺服器端腳本語言,可以處理表單、產生動態頁面和管理存取權限等任務。而Angular是一種JavaScript的框架,可以用來開發單一頁面應用程式和建構元件化的網頁應用程式。本篇文章將介紹如何使用PHP和Angular進行前端開發,以及如何將它們

淺析angular中怎麼使用monaco-editor 淺析angular中怎麼使用monaco-editor Oct 17, 2022 pm 08:04 PM

angular中怎麼使用monaco-editor?以下這篇文章記錄下最近的一次業務中用到的 m​​onaco-editor 在 angular 中的使用,希望對大家有幫助!

淺析Angular中的獨立組件,看看怎麼使用 淺析Angular中的獨立組件,看看怎麼使用 Jun 23, 2022 pm 03:49 PM

這篇文章帶大家了解Angular中的獨立元件,看看怎麼在Angular中建立一個獨立元件,怎麼在獨立元件中導入已有的模組,希望對大家有幫助!

See all articles