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一区二区
99精品视频播放| 中国一级黄色录像| 国产女大学生av| 日本一级黄视频| 免费看av软件| 秋霞在线一区二区| 欧美精品一区二区性色a+v| 91欧美一区二区三区| 亚洲色图偷拍视频| 色呦呦网站入口| 久久视频免费在线| 青草网在线观看| 青青青免费在线| 国产一区二区视频免费在线观看| wwwxxx黄色片| 日韩肉感妇bbwbbwbbw| 亚洲精品中文字幕乱码无线| 黄色一级片网址| 国产精品视频一二三四区| 国产女教师bbwbbwbbw| 一区二区传媒有限公司| 日韩av一二三四| 天天干天天曰天天操| 国产一区 在线播放| 日本一区二区黄色| 国产免费又粗又猛又爽| av动漫免费观看| 国产乱子伦农村叉叉叉| 欧美婷婷精品激情| 成人区一区二区| 超碰在线公开97| 亚洲精品少妇一区二区| 欧美一级片中文字幕| 天堂在线精品视频| wwwxxx黄色片| 女人床在线观看| 波多野结衣天堂| 国产免费黄色一级片| 国产又黄又猛又粗| 国产素人在线观看| 日韩最新中文字幕| 中文字幕天天干| 欧美爱爱视频免费看| 日本黄色播放器| 国产成人亚洲精品无码h在线 | www在线观看免费| 伊人成人222| 国产精品免费成人| 大伊香蕉精品视频在线| 午夜一区二区视频| 精品久久久久久中文字幕2017| 免费看黄色a级片| 亚洲三级在线观看视频| 欧美精品一区二区三区免费播放| 91免费国产精品| 91亚洲一区二区| 五月天av在线播放| 黄色免费网址大全| 久久黄色免费看| 凹凸国产熟女精品视频| av在线com| 亚洲国产精品无码av| 熟女视频一区二区三区| 不用播放器的免费av| 亚洲五月天综合| 不卡的av中文字幕| 日本中文字幕精品—区二区| www黄色av| www.亚洲成人网| 超碰97人人射妻| 久久精品国产露脸对白| 依人在线免费视频| 亚洲午夜精品一区| 欧美xxxxxbbbbb| 日韩av加勒比| 国产日产欧美一区二区| 欧洲在线免费视频| 婷婷视频在线播放| 香港三级日本三级a视频| 国产精品日韩三级| 好吊妞无缓冲视频观看| 日本成人中文字幕在线| 在线看免费毛片| 国产911在线观看| 激情深爱综合网| 麻豆传传媒久久久爱| 日本美女高潮视频| 国产一区一区三区| www.日本在线播放| 人妻无码视频一区二区三区| 日韩精品视频一二三| 欧美交换配乱吟粗大25p| 无码中文字幕色专区| 国产又大又黄又粗的视频| 日本网站在线看| 午夜精品久久久久久久无码| 91淫黄看大片| 日本福利视频网站| 国产自偷自偷免费一区 | www.九色.com| 激情综合网俺也去| 亚洲熟妇无码av在线播放| 免费无码av片在线观看| 激情文学亚洲色图| www.中文字幕在线| 91精品国产三级| 日本三级免费观看| 国产传媒久久久| 鲁一鲁一鲁一鲁一av| 18黄暴禁片在线观看| 美女少妇一区二区| 日韩在线综合网| 欧美视频在线第一页| 一个色综合久久| 久久久久狠狠高潮亚洲精品| 精品久久久无码人妻字幂| 91极品视频在线观看| 久久国产亚洲精品无码| www.国产亚洲| 裸体大乳女做爰69| 国产三级精品三级在线| 成人在线激情网| 免费无码不卡视频在线观看| 欧美视频在线第一页| 日韩第一页在线观看| 精品亚洲视频在线| 日本高清久久久| 日本高清久久久| 亚洲黄色a v| 爱情岛论坛vip永久入口| 人妻有码中文字幕| 99免费视频观看| 成人一区二区三| 天天干天天操天天做| 国产精品嫩草影院8vv8| 少妇一级淫免费放| 亚洲36d大奶网| 亚洲高清免费在线观看| 亚洲一区二区在线视频观看| 青青草久久伊人| 一本—道久久a久久精品蜜桃| 成人中文字幕av| 91福利免费观看| 9999在线观看| 国产 日韩 亚洲 欧美| 免费看国产曰批40分钟| 999香蕉视频| 又色又爽又黄视频| 成人免费看片'免费看| 欧美高清中文字幕| www.亚洲天堂网| 最新av免费在线观看| 精品无码av无码免费专区| 精品人妻大屁股白浆无码| 国产91在线免费| www.久久久久久久久久久| 国产精品一二三在线观看| 亚洲国产精品成人天堂| 男人的天堂日韩| 日本老太婆做爰视频| 免费av手机在线观看| 午夜视频在线瓜伦| 欧美爱爱视频网站| av免费观看网| 天天做天天爱天天高潮| 日本久久久精品视频| av在线免费看片| 青青草国产精品视频| 伊人网在线综合| 妺妺窝人体色777777| 伊人色在线观看| 99热在线这里只有精品| 国产九九九视频| 国产免费视频传媒| 青青在线视频免费观看| 五月婷婷狠狠操| 日日摸日日碰夜夜爽av| 亚洲色图都市激情| 亚洲第一中文av| www黄色av| a天堂资源在线观看| 小早川怜子一区二区三区| 99999精品视频| 国产无限制自拍| av磁力番号网| 欧美日韩在线免费观看视频| 97公开免费视频| 国产熟女高潮视频| 国产综合av在线| 三上悠亚久久精品| 99久久免费观看| 日本福利视频在线观看| 日韩不卡一二区| 善良的小姨在线| 色偷偷中文字幕| 午夜精品久久久久久久99热影院| 可以免费在线看黄的网站| 久久国产乱子伦免费精品| 人妻精品无码一区二区三区| 男人天堂手机在线视频|