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一区二区
久色视频在线播放| 播放灌醉水嫩大学生国内精品| 草草视频在线免费观看| 中文字幕在线视频一区二区| 欧美一级特黄a| 邪恶网站在线观看| 网站在线你懂的| 国产在线视频三区| 一本一道久久a久久综合蜜桃| 无码内射中文字幕岛国片| 男人靠女人免费视频网站| 国产伦精品一区二区三区四区视频_| 樱花草www在线| 欧美一级爱爱视频| 国产精品国产对白熟妇| 国产h视频在线播放| 国产在线青青草| 天堂社区在线视频| 亚洲av无日韩毛片久久| 黄色一级大片免费| av7777777| 韩国中文字幕av| 五月天男人天堂| 香港三级日本三级a视频| 日本精品久久久久久久久久| 久在线观看视频| 亚洲色图 在线视频| 精品国产乱码久久久久久1区二区| 男插女免费视频| 日本a在线免费观看| 无码日韩人妻精品久久蜜桃| 毛毛毛毛毛毛毛片123| 欧美交换配乱吟粗大25p| 激情六月丁香婷婷| 欧美性受xxxxxx黑人xyx性爽| 成人在线视频一区二区三区| 91淫黄看大片| 国产尤物av一区二区三区| 日韩视频免费在线播放| 中国一级大黄大黄大色毛片| 午夜肉伦伦影院| 黑人巨茎大战欧美白妇| 91极品尤物在线播放国产| 久久亚洲a v| 中国黄色片一级| 国产性xxxx18免费观看视频| 视频一区二区视频| 在线观看免费不卡av| 国产69精品久久久久久久| 欧美激情第四页| 污污网站免费观看| 青青艹视频在线| 日韩欧美猛交xxxxx无码| 91国产精品视频在线观看| 免费国产黄色网址| 91精品国产吴梦梦| 国产探花在线观看视频| 日韩一级免费片| 乌克兰美女av| 九热视频在线观看| 无码内射中文字幕岛国片| 一二三四视频社区在线| 亚洲高潮无码久久| 五月天婷婷在线观看视频| av中文字幕网址| 五月婷婷丁香综合网| 国产女女做受ⅹxx高潮| 成人在线看视频| 老司机午夜av| 日本久久久久久久久久久久| www.日日操| 午夜免费看毛片| 日本一二区免费| 中文字幕av导航| 日本丰满大乳奶| 加勒比成人在线| www.爱色av.com| 成人av一级片| 一本岛在线视频| 色姑娘综合天天| 国产日韩欧美精品在线观看| 欧美日韩福利在线| 黄色国产小视频| 免费网站在线观看黄| www.久久av.com| 欧洲精品在线播放| 成年人视频网站免费观看| 污网站免费在线| 在线观看污视频| 国产亚洲精品网站| 国产区二区三区| 亚洲av综合色区| 乱子伦视频在线看| 波多野结衣在线免费观看| 欧美一级视频在线播放| www.xxx亚洲| 国产精品88久久久久久妇女| 黄色一级视频片| 天天干天天av| 久久久久久久中文| 久久精品国产露脸对白| 人妻久久久一区二区三区| 午夜激情av在线| 久久成人福利视频| 欧美wwwwwww| 黄色免费视频大全| 欧美日韩激情四射| 手机在线成人免费视频| 亚洲 自拍 另类小说综合图区| 欧美日韩一区二区三区69堂| 国产手机免费视频| 黄色小视频免费网站| 国产a视频免费观看| 国产尤物av一区二区三区| 中文字幕在线观看日| 免费午夜视频在线观看| 肉大捧一出免费观看网站在线播放 | 日本免费黄视频| 麻豆传媒网站在线观看| 久久黄色片网站| 男女视频一区二区三区| 131美女爱做视频| av免费看网址| 国产精品av免费观看| 在线a免费观看| www.com操| 亚洲视频在线观看一区二区三区| www黄色日本| 美女av免费在线观看| 又粗又黑又大的吊av| av网站大全免费| 九九热只有这里有精品| 久久久99精品视频| www.欧美黄色| 僵尸世界大战2 在线播放| 久久www视频| 日本久久久网站| 狠狠干 狠狠操| jizzjizz国产精品喷水| 5月婷婷6月丁香| 男女视频一区二区三区| 亚洲欧美久久久久| 99视频在线观看视频| 日韩中文在线字幕| 欧美在线观看视频免费| 日韩欧美国产综合在线| 国产最新免费视频| 91人人澡人人爽人人精品| xx欧美撒尿嘘撒尿xx| 天天久久综合网| 污污污污污污www网站免费| 免费在线观看亚洲视频| 久章草在线视频| 色婷婷综合在线观看| 国产二区视频在线| 日本女优爱爱视频| 黄色片免费网址| 黄色国产一级视频| 色啦啦av综合| www.xxx麻豆| 中文字幕国内自拍| 9999在线观看| 中国丰满人妻videoshd| 亚洲一区二区中文字幕在线观看| 日韩精品免费一区| 99免费视频观看| 公共露出暴露狂另类av| 成人精品视频一区二区| 麻豆映画在线观看| 超碰网在线观看| 欧美做暖暖视频| 久热精品在线播放| 国产视频一视频二| 国产av第一区| 亚洲成色www.777999| 免费网站永久免费观看| 午夜精品中文字幕| 国产人妻777人伦精品hd| 免费看啪啪网站| 久久久精品麻豆| 国产黄色一级网站| 欧美大片免费播放| 自拍偷拍21p| 99草草国产熟女视频在线| 免费极品av一视觉盛宴| wwwwwxxxx日本| 北条麻妃69av| www.国产在线播放| aaa免费在线观看| 污网站在线免费| 久久综合久久色| 缅甸午夜性猛交xxxx| 国产肉体ⅹxxx137大胆| 亚洲av首页在线| 男女视频在线观看网站| 五月激情婷婷在线| 手机免费av片| 国产探花在线观看视频| 中文字幕线观看| 亚洲综合20p|