成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網
最全最豐富的資訊網站

聊聊Angular Route中怎么提前獲取數據

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

<div class="loader" *ngIf="isLoader">   <div>Loading...</div> </div> <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 的加持下,你可以提升你應用的表現。了解

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
在线观看亚洲一区| 一本一道久久综合久久| 亚洲精品无码少妇30P| 亚洲熟妇无码AV| 曰韩精品无码一区二区三区视频| 4虎CVT4WD| YW尤物无码点击进入| 高潮颤抖大叫正在线播放| 国产精品99久久99久久久动漫| 国产桃色无码视频在线观看| 精品亚洲成A人无码成A在线观看| 亂倫近親相姦中文字幕AV| 欧美性猛烈XXXX极品少妇| 色情ⅩXXX欧美色妇HD| 午夜亚洲WWW湿好爽| 亚洲色成人网站WWW永久四虎| 中字年轻漂亮的儿媳BD| 成人年无码AV片在线观看| 国产精品无码一区二区三区| 精品人妻无码视频一区二区三区| 免费国产成人AⅤ观看| 日产精品卡二卡三卡四妈妈的朋友 | 免费A级毛片无码韩国| 人妻无码一区二区19P| 无码少妇一区二区三区芒果| 亚洲午夜精品一区二区| YW尤物AV无码| 国产乱人伦偷精品视频免下载| 久久国产精品久久精品国产| 人妻精品久久久久中文字幕一冢本| 我的初苞被强开了| 亚洲综合AV色婷婷国产野外| JAPANESE丰满人妻HD| 久久国产热这里只有精品| GAYFUCKⅩⅩⅩⅩHD激情| 亚洲成aV人无码| 乌克兰XXXXXLMEDJYF| 人妻系列无码专区久久五月天| 久久人妻无码一区二区三区AV | 熟女亚洲综合精品伊人久久| 玩弄CHANEL妇熟女| 日韩欧美视频一区| 亚洲自偷自偷偷色无码中文| JAPAN丰满人妻VIDEOS| 国产免费无码一区二区三区| 蜜芽VA亚洲VA欧美VA天堂| 婷婷久久综合九色综合97| 在线日产精品一区| 国产精品JIZZ在线观看| 麻豆国产MV视频| 无码精品人妻一区二区三区ap| 中国女人FREE性HD| 国产精品人人妻人色五月| 免费私人家庭影院| 亚欧成人中文字幕一区| MAC水蜜桃色314| 精品人妻无码视频一区二区三区| 日韩国产成人无码AV毛片| 野花韩国视频在线观看免费高清| 高清性色生活片97| 免费精东传媒VS天美传媒| 小荡货奶真大水真多紧视频| AV天堂午夜精品一区| 精产国品一二三产区区别在哪儿| 日韩精品一二三区| 在线天堂免费观看.WWW| 国产三级精品三级在线专区| 青青草无码精品伊人久久蜜臀| 亚洲成AV人片在线观看橙子| 厨房人妻HD中文字幕69XX| 美丽的熟妇中文字幕| 亚洲AⅤ无码成人网站国产APP| 锕锕锕锕锕锕~好深啊APP下载| 精品无码中文字幕不卡| 偷窥熟女大屁股对白视频| 97久章草在线视频播放| 精品韩国亚洲AV无码不卡区| 熟女无套高潮内谢吼叫免费| 99久久精品免费观看国产| 久99久无码精品视频免费播放| 天天影视性色香欲综合网| A级毛片毛片免费观的看久| 久久AV无码AV高潮AV喷吹| 无码AV中文字幕出轨人妻 | 逆徒每天都想着欺师犯上 | 久久AⅤ天堂AV无码AV| 无码精品一区二区三区在线| 波多野结衣在线观看AV| 蜜桃av噜噜噜一区二区三区| 亚洲国产精品成人AV在线| 国产成A人亚洲精V品无码| 全部极品AV娱乐盛宴| 曰本无码人妻丰满熟妇啪| 精品国产乱码久久久久久1区2区| 我趁老师喝醉后玩弄她的身体 | 国产性自爱拍偷在在线播放| 色综合色狠狠天天综合色| JEΑL0USVUE成熟50M| 可以差差差的视频无掩盖| 亚洲精品无码不卡久久久久| 国产无套无码AⅤ在线观看| 少妇99久久黑人| 波多波多野结衣中文无| 欧美成人一区在线| 中国老妇XXXX性开放| 九九AV高潮AV无码AV喷吹| 亚洲AV无码专区在线播放中文 | おとまりせくす中文在线| 你的奶好大让老子摸摸的说说| 一边做饭一边躁狂的原因分析| 精品国产欧美一区二区| 亚洲AV永久无码精品秋霞电影秋| 国产精品一区二区 尿失禁| 天堂俺去俺来也WWW色官网| 番茄TODO社区免费看片| 日本少妇ASS浓精PICS| А天堂中文最新版在线官网| 欧美群妇大交乱视| 99久久综合狠狠综合久久止| 免费人成网WW555KKK在线| 中国极品少妇XXXXX1314| 蜜桃Av噜噜一区二区三区网址 | 久久99精品国产麻豆| 亚洲AVSSS在线观看| 国产拍揄自揄免费观看| 西西人体444WWW大胆无码视| 国产精品爽爽VA在线观看网站| 无码成人一区二区| 国产乱XXXX搡XXXXX搡| 午夜伦伦电影理论片大片| 国产目拍亚洲精品一区| 羞羞漫画十八禁啪啪漫画免费 | 亚洲AV高清一区二区三区| 国色天香精品一卡2卡3卡老狼| 亚洲AV一二三又爽又色又色| 狠狠躁日日躁夜夜躁2020| 亚洲精品亚洲人成在线观看| 精品人妻AV一区二区三区| 亚洲欧洲精品成人久久曰影片 | 日本毛多水多做受视频| 粗大猛烈进出高潮视频免费看| 肉欲麻豆天美传媒| 国产精品爆乳在线播放第一人称| 无码人妻精品一二三区免费| 国内粗鲁VIDEO老熟妇| 亚洲乱色熟女一区二区三区蜜臀| 久久精品国产9久久综合| 在线观看亚洲一区| 欧美人妻精品一区二区免费看| 波多野结衣办公室激情30分钟| 色老头BGMBGMBGM| 国产麻传媒精品国产AV| 亚洲精品白浆高清久久久久久| 久久久久无码国产精品一区| 中文字幕无线码一区二区| 情侣过夜的男生会忍住吗| 乖我们换个姿态再来一遍吧的小说 | 无码少妇一区二区浪潮av| 黄 色 网 站 在 线 免费| 又粗又粗又黄又硬又深色的| 欧美性激烈粗大精品XXX| 疯狂做受XXXX国产| 亚洲AV永久无码国产精品久久| 拒嫁豪门少奶奶99次出逃 | 青梅被从小摸到大H补课1视频 | 亚洲国产AV无码一区二区三区| 久久久久久精品久久久| 99久久精品无码一区二区毛片| 日日噜噜夜夜狠狠视频| 国产香蕉国产精品偷在线| 伊人久久大香线蕉在观看| 人妻无码视频一区二区三区| 国产精品三级一区二区| 亚洲夂夂婷婷色拍WW47| 欧美一级137片内射亚洲| 国产成人无码AV片在线观看不卡| 亚洲AV中文无码乱人伦在线观看| 麻豆乱码1区2区新区| 厨房里的激战2类型| 亚洲AV午夜成人片忘忧草在线 | √BT天堂网WWW中文在线| 色欲av成人蜜臀av不卡| 精品第一国产综合精品蜜芽| 97久久香蕉国产线看观看| 我趁老师睡觉摸她奶脱她内裤 | 一边做饭一边暴躁怎么办 | 男男H黄漫画啪啪无遮挡| 公交车后车座疯狂的做的细节| 亚洲人JIZZ日本人| 人妻无码AⅤ中文字幕视频| 国产亚洲欧洲综合5388| 7777精品久久久大香线蕉| 忘忧草WWW中文在线资源| 老头扒开粉嫩的小缝亲吻网站| 成人午夜无码国产| 亚洲欧洲无码一区二区三区| 欧美最猛黑人XXXⅩ猛男视频| 国模无码视频一区| JAPANESEⅩⅩⅩHD护士| 亚洲成AV人片在线观看无|