gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

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

聊聊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號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
成年人网站免费视频| 免费一级特黄特色毛片久久看| 欧美乱大交xxxxx潮喷l头像| 日本在线视频www色| 无码专区aaaaaa免费视频| 免费看国产曰批40分钟| www.天天射.com| 成人性做爰片免费视频| 国产www免费| 啊啊啊国产视频| 久久综合亚洲精品| 日韩欧美xxxx| 91精品国产91久久久久麻豆 主演| 国产三级日本三级在线播放| 善良的小姨在线| 免费涩涩18网站入口| 日韩av综合在线观看| 中文字幕色呦呦| 在线不卡一区二区三区| 亚洲xxxx2d动漫1| 亚洲国产精品三区| 欧美婷婷精品激情| 九九热视频免费| 异国色恋浪漫潭| 精品视频在线观看一区二区| 午夜在线视频免费观看| 国产精品亚洲天堂| 天天操夜夜操很很操| 日韩不卡的av| 国产精品无码免费专区午夜| 男人的天堂成人| 色欲色香天天天综合网www| 丰满的少妇愉情hd高清果冻传媒| 97碰在线视频| 欧美精品一区二区三区免费播放| 成人一级片网站| 97人人爽人人| 国产美女在线一区| 青青在线视频免费| 国内自拍第二页| 欧美在线观看www| 做a视频在线观看| 日韩精品 欧美| 奇米777在线| 男女污污的视频| 久久久免费视频网站| 国产日韩欧美大片| 亚洲欧美激情网| 色诱视频在线观看| 伊人成色综合网| 欧美一级免费播放| 国产精品69久久久| 黄色网zhan| 日本一级黄视频| www.射射射| 国产精品久久久久9999爆乳| 超碰人人爱人人| 精品一二三四五区| 2019日韩中文字幕mv| 浮妇高潮喷白浆视频| 97超碰青青草| 伊人免费视频二| 久久99久久99精品| caoporn超碰97| 欧美视频亚洲图片| 黄色一级片在线看| 国产 porn| 成年丰满熟妇午夜免费视频| www婷婷av久久久影片| 国产激情在线观看视频| 亚洲第一成肉网| 污污视频网站免费观看| 国产内射老熟女aaaa| 日韩一级在线免费观看| 免费不卡av网站| 午夜精品在线免费观看| 三上悠亚久久精品| 久久99国产精品一区| 男人午夜视频在线观看| 国产极品粉嫩福利姬萌白酱| 免费的av在线| 亚洲天堂第一区| 日韩中文在线字幕| 午夜激情影院在线观看| 波多结衣在线观看| 亚洲色图久久久| 亚洲va综合va国产va中文| 成人精品视频一区二区| 可以在线看的av网站| 免费观看黄色大片| 国产一区一区三区| 黄色污污在线观看| 九一国产精品视频| av无码精品一区二区三区| 不卡av免费在线| 男操女免费网站| 人人妻人人澡人人爽精品欧美一区| 网站在线你懂的| 免费观看亚洲视频| 国产真实乱子伦| 超碰在线资源站| 可以在线看的av网站| 毛葺葺老太做受视频| 黑人巨大国产9丨视频| 男人添女人下面高潮视频| 国产又大又黄又粗的视频| 欧美一级中文字幕| 日韩欧美色视频| 最新天堂在线视频| 麻豆av免费在线| 日韩中文字幕在线视频观看| 天天做天天爱天天高潮| 亚洲国产精品久久久久爰色欲| 天天干天天曰天天操| 国产aaaaa毛片| 国产主播中文字幕| 麻豆av免费在线| 国产精品欧美激情在线观看| 国产 欧美 日韩 一区| 青娱乐国产精品视频| 国产无遮挡猛进猛出免费软件| 国产成人无码av在线播放dvd| 日本a在线免费观看| 亚洲熟妇无码av在线播放| 国产欧美久久久久| 警花观音坐莲激情销魂小说| 超碰91在线播放| 国产主播在线看| 国产精品igao| 日本三级福利片| 日韩av高清在线看片| 日韩欧美亚洲天堂| 天天干天天色天天干| 成人精品视频在线播放| av免费网站观看| 日韩激情视频一区二区| 国产av无码专区亚洲精品| 亚洲理论中文字幕| www黄色日本| 日本wwwcom| 亚洲精品中文字幕乱码无线| 一二三四视频社区在线| 欧美国产亚洲一区| 蜜桃视频一区二区在线观看| 欧美牲交a欧美牲交aⅴ免费真| 亚洲精品中文字幕乱码无线| 99福利在线观看| 欧美 国产 综合| 日韩 欧美 高清| 国产青青在线视频| 97久久国产亚洲精品超碰热| 色免费在线视频| 中文久久久久久| 中文字幕网av| 久热在线视频观看| 免费看污黄网站| а 天堂 在线| 欧美a级黄色大片| 国产成人一二三区| 男女激情无遮挡| 91人人澡人人爽人人精品| 国产超碰在线播放| 亚洲欧美自偷自拍另类| 色播五月激情五月| 91精品一区二区三区四区| 97在线国产视频| 91国产精品视频在线观看| 色戒在线免费观看| 日本一区二区三区四区五区六区| av动漫免费观看| 六月丁香婷婷激情| 99热手机在线| 国产肥臀一区二区福利视频| 亚洲熟妇av一区二区三区| 永久免费的av网站| 国产日韩亚洲欧美在线| 88av.com| 人妻夜夜添夜夜无码av| 手机免费看av网站| av天堂永久资源网| 91看片淫黄大片91| 污视频网站观看| 成人在线国产视频| 欧美性潮喷xxxxx免费视频看| 日韩xxxx视频| 妺妺窝人体色www看人体| 亚洲五月激情网| 色中文字幕在线观看| 91丝袜超薄交口足| 亚洲精品久久久中文字幕| 日本十八禁视频无遮挡| av在线播放天堂| 妞干网在线视频观看| 日本三级免费观看| 波多野结衣天堂| 亚洲最大天堂网| 国内自拍中文字幕| 丰满少妇被猛烈进入高清播放| 国产精品免费看久久久无码| 少妇人妻无码专区视频|