久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

聊聊Angular Route中怎么提前獲取數(shù)據(jù)

Angular Route中怎么提前獲取數(shù)據(jù)?下面本篇文章給大家介紹一下從 Angular Route 中提前獲取數(shù)據(jù)的方法,希望對(duì)大家有所幫助!

聊聊Angular Route中怎么提前獲取數(shù)據(jù)

提前獲取意味著在數(shù)據(jù)呈現(xiàn)在屏幕之前獲取到數(shù)據(jù)。本文中,你將學(xué)到,在路由更改前怎么獲取到數(shù)據(jù)。通過本文,你將學(xué)會(huì)使用 resolver, 在 Angular App 中應(yīng)用 resolver,應(yīng)用到一個(gè)公共的預(yù)加載導(dǎo)航。【相關(guān)教程推薦:《angular教程》】

你為什么應(yīng)該使用 Resolver

Resolver 在路由跟組件之間扮演著中間件服務(wù)的角色。假設(shè)你有一個(gè)表單,沒有數(shù)據(jù)時(shí),你想向用戶一個(gè)空的表單,當(dāng)在加載用戶數(shù)據(jù)時(shí)展示一個(gè) loader,然后當(dāng)數(shù)據(jù)返回時(shí),填充表單并隱藏 loader

通常,我們都會(huì)在組件的 ngOnInit() 鉤子函數(shù)中獲取數(shù)據(jù)。也就是說,組件加載完之后,我們發(fā)起數(shù)據(jù)請(qǐng)求。

ngOnInit() 中操作,我們需要在每個(gè)需要的組件加載后,在其路由頁面中添加 loader 展示。Resolver 可以簡化 loader 的添加使用。你可以只添加一個(gè)適用于每個(gè)路由的 loader,而不是每個(gè)路由中都添加 loader

本文將結(jié)合示例來解析 resolver 的知識(shí)點(diǎn)。以便于你可以牢記它并在項(xiàng)目中使用它。

在應(yīng)用中使用 Resolver

為了在應(yīng)用中使用 resolver,你需要準(zhǔn)備一些接口。你可以通過 JSONPlaceholder 來模擬,而不需要自己開發(fā)。

JSONPlaceholder 是一個(gè)很棒的接口資源,你可以借助它更好學(xué)習(xí)前端的相關(guān)概念而不被接口所約束。

現(xiàn)在,接口的問題解決了,我們可以開始 resolver 的應(yīng)用了。一個(gè) resolver 就是一個(gè)中間件服務(wù),所以我們將創(chuàng)建一個(gè)服務(wù)。

$ ng g s resolvers/demo-resolver --skipTests=true

–skipTests=true 跳過生成測試文件

src/app/resolvers 文件夾中創(chuàng)建了一個(gè)服務(wù)。resolver 接口中有一個(gè) resolve() 方法,它有兩個(gè)參數(shù):routeActivatedRouteSnapshot 的實(shí)例)和 state(RouterStateSnapshot 的實(shí)例)。

loader 通常是在 ngOnInit() 中編寫所有的 AJAX 請(qǐng)求,但是邏輯將會(huì)在 resolver 中實(shí)現(xiàn),替代 ngOnInit()

接著,創(chuàng)建一個(gè)服務(wù)來獲取 JSONPlaceholder 中列表數(shù)據(jù)。然后在 resolver 中底調(diào)用,接著在路由中配置 resolve信息,(頁面將會(huì)等待)直到 resolver 被處理。在 resolver 被處理之后,我們可以通過路由來獲取數(shù)據(jù)然后展示在組件中。

創(chuàng)建服務(wù)并編寫邏輯獲取列表數(shù)據(jù)

$ ng g s services/posts --skipTests=true

現(xiàn)在,我們成功創(chuàng)建了服務(wù),是時(shí)候編寫一個(gè) AJAX 請(qǐng)求的邏輯了。

model 的使用能夠幫助我們減少錯(cuò)誤。

$ ng g class models/post --skipTests=true

post.ts

export class Post {  id: number;   title: string;   body: string;   userId: string; }

model 就緒,是時(shí)候獲取帖子 post 的數(shù)據(jù)了。

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

現(xiàn)在,這個(gè)服務(wù)隨時(shí)可被調(diào)用。

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

帖子列表數(shù)據(jù)從 resolver 中返回。現(xiàn)在,你需要一個(gè)路由去配置 resolver,從路由獲取數(shù)據(jù),然后讓數(shù)據(jù)展示在組件中。為了進(jìn)行路由跳轉(zhuǎn),我們需要?jiǎng)?chuàng)建一個(gè)組件。

$ ng g c components/post-list --skipTests=true

為了路由可見,在 app.component.ts 添加 router-outlet

<router-outlet></router-outlet>

現(xiàn)在,你可以配置 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 {}

一個(gè) resolve 已經(jīng)添加到路由配置中了,它將發(fā)起一個(gè) HTTP 請(qǐng)求,然后當(dāng) HTTP 請(qǐng)求成功返回后,允許組件初始化。路由將組裝獲取到的 HTTP 請(qǐng)求返回的數(shù)據(jù)。

怎么應(yīng)用一個(gè)預(yù)加載導(dǎo)航

向用戶展示一個(gè)請(qǐng)求正在進(jìn)行,我們?cè)?AppComponent 中編寫一個(gè)公共且簡單的 loader。你可以根據(jù)需要自定義。

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

當(dāng)導(dǎo)航開始,isLoader 值被賦予 true,頁面中,你將看到下面的效果。

聊聊Angular Route中怎么提前獲取數(shù)據(jù)

當(dāng) resolver 處理完之后,它將會(huì)被隱藏。

現(xiàn)在,是時(shí)候從路由中獲取值并將其展示出來。

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。這值都可以獲取,只要你在路由中配置了相同的信息。

我們?cè)?HTML 進(jìn)行如下渲染。

<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 預(yù)處理器編寫樣式

從路由中獲取數(shù)據(jù)之后,它會(huì)被展示在 HTML 中。效果如下快照。

聊聊Angular Route中怎么提前獲取數(shù)據(jù)

至此,你已經(jīng)了解完怎么應(yīng)用 resolver 在你的項(xiàng)目中了。

總結(jié)

結(jié)合用戶體驗(yàn)設(shè)計(jì),在 resolver 的加持下,你可以提升你應(yīng)用的表現(xiàn)。了解

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
99精品在线免费在线观看| 国产精品99久久免费| 成人综合一区| 国产专区精品| 超碰在线99| 成人久久一区| 婷婷成人在线| 日韩精品影视| 午夜久久tv| 视频一区中文字幕| 涩涩涩久久久成人精品| 理论片午夜视频在线观看| 麻豆精品国产91久久久久久| 精品国产欧美日韩一区二区三区| 免费在线看一区| 亚洲精品视频一二三区| 日本在线视频一区二区| 国产精品久久久一区二区| 久久99伊人| 日韩在线综合| 久久精品亚洲人成影院| 欧美精品黄色| 免费精品视频最新在线| 国产亚洲电影| 美女精品在线观看| 日韩一区中文| 国产精品观看| xxxxx性欧美特大| 欧美日韩四区| 日本欧美一区| 日韩av自拍| 午夜一区在线| 久久av日韩| 激情欧美一区二区三区| 视频一区日韩精品| 国产一区二区久久久久| 国产精品成人**免费视频 | 亚洲女同一区| 美日韩精品视频| 久久av网址| 午夜精品影院| 国产精久久久| 美女少妇全过程你懂的久久| 日韩中文字幕一区二区高清99| 婷婷综合激情| 亚洲精品一区二区在线播放∴| 欧美特黄视频| 日韩精品视频网站| 樱桃视频成人在线观看| 天使萌一区二区三区免费观看| 亚洲不卡av不卡一区二区| 久久国产精品毛片| 精品视频自拍| 久久电影一区| 成人午夜毛片| 亚洲一区欧美| 蜜臀av免费一区二区三区| 国产女人18毛片水真多18精品| 奇米777国产一区国产二区| 国产一区二区三区91| 水野朝阳av一区二区三区| 久久成人亚洲| 美女国产一区二区三区| 欧美美女一区| 久久99蜜桃| 麻豆精品在线播放| 欧洲激情综合| 一区二区亚洲精品| 国产欧美另类| 麻豆精品蜜桃视频网站| 你懂的国产精品永久在线| 999久久久国产精品| 国产精品尤物| 免费不卡在线视频| 日韩免费视频| 国产精品美女午夜爽爽| 亚洲一区成人| 亚洲风情在线资源| 国产精品一区二区99| 伊人久久成人| 日本а中文在线天堂| 欧美日韩a区| 精品视频91| 亚洲三级精品| 国产在线欧美| 成人在线免费观看91| 日韩在线观看不卡| se01亚洲视频 | 精品国产乱码| 国产精品久久久免费| 亚洲精品888| 国产成人调教视频在线观看| 日本中文字幕视频一区| 在线国产一区二区| 日韩精品一区二区三区中文 | 精品国产18久久久久久二百| 亚洲有吗中文字幕| 欧美亚洲在线日韩| 国产色播av在线| 国产精品嫩模av在线| 亚洲精品乱码日韩| 在线亚洲精品| 久久久久久美女精品| 综合一区av| 婷婷亚洲五月| 欧美性感美女一区二区| av中文字幕在线观看第一页| 欧美在线亚洲| 日韩av三区| 亚洲人成在线影院| 免费观看久久久4p| 石原莉奈在线亚洲三区| 国产精品**亚洲精品| 日韩精品高清不卡| 欧产日产国产精品视频| 国产精品18| 欧美aa在线视频| 老牛国内精品亚洲成av人片| 国产精品毛片久久久| 精品一区亚洲| 日韩精品免费一区二区三区| av一区在线| 国产一区观看| 国产韩日影视精品| 亚洲一区日本| 蜜桃一区二区三区在线观看| 热久久免费视频| 一级成人国产| 日韩av不卡在线观看| 国产乱码精品一区二区三区四区| 亚洲大全视频| 欧美日韩色图| 亚洲美洲欧洲综合国产一区| 91九色精品| 久久99精品久久久野外观看| 亚洲欧美日韩高清在线| 国产伦精品一区二区三区视频| 136国产福利精品导航网址| 欧美aa一级| 黄色欧美日韩| 亚洲日本欧美| 国产欧美丝祙| 欧美国产另类| 久久久久久一区二区| 综合亚洲自拍| 91大神在线观看线路一区| 国产精品嫩模av在线| 国产一区二区三区探花| 97se综合| 亚洲精品97| 日本国产亚洲| 久草精品视频| 亚洲午夜黄色| 亚洲一级淫片| 久久av综合| 久久影院一区| 亚洲一区欧美| 国产精品igao视频网网址不卡日韩 | 精品国产一区二区三区性色av| 日韩在线a电影| 亚州av一区| 精品国产黄a∨片高清在线| 九色porny丨国产首页在线| 一区二区视频欧美| 国产亚洲欧美日韩精品一区二区三区| 久久国产精品亚洲77777| 国产不卡精品在线| 美女在线视频一区| 国产精品久久久久久久久久白浆| 日韩影院免费视频| 欧美欧美黄在线二区| 国产成人精品一区二区免费看京| 麻豆中文一区二区| 日本不卡中文字幕| 成人在线黄色| 蜜臀va亚洲va欧美va天堂| 欧美国产视频| 国产一区白浆| 欧美国产极品| 伊人久久亚洲美女图片| 国产日韩中文在线中文字幕| 日本免费一区二区三区四区| 给我免费播放日韩视频| 激情欧美一区二区三区| 日韩三区四区| 日本精品影院| 国产欧美日韩在线观看视频| 99精品一区| 国产精品va视频| 国产精品普通话对白| 精品三级久久久| 蜜桃传媒麻豆第一区在线观看| 蜜臀国产一区二区三区在线播放| 黄色日韩精品| 国产精品亚洲一区二区在线观看| 国产精品亚洲产品| 999国产精品| 国产日韩一区二区三区在线播放| 国产欧美一区二区三区国产幕精品 | 久久久国产精品网站|