久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久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 中返回?,F在,你需要一個路由去配置 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號
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
四虎国产精品免费观看| 国产精品视频一区二区三区四蜜臂 | 欧美丝袜一区| 中文另类视频| 日韩电影免费网站| 国产综合婷婷| 在线一区二区三区视频| 日韩精品成人在线观看| 国产欧美成人| 樱桃视频成人在线观看| 久草免费在线视频| 影视先锋久久| 亚洲青青久久| 麻豆国产欧美一区二区三区| 福利一区和二区| 在线综合视频| 国产精品蜜月aⅴ在线| 欧美国产一级| 国产视频一区免费看| 91成人小视频| 蜜桃精品在线| 青青草国产成人99久久| 成人午夜亚洲| 一区二区日韩免费看| 久久精品国产福利| 日韩大片在线播放| 日本成人在线不卡视频| 日韩欧美一区二区三区在线观看| 欧美日韩国产高清| 欧美激情日韩| 伊人久久一区| 国产亚洲一区二区手机在线观看 | www.九色在线| 亚洲性视频在线| 天堂av在线| 国产精品夜夜夜| 黑丝美女一区二区| 久久国内精品视频| 狠狠爱成人网| 国产精品久久久久久久免费观看| 国产精品免费看| 国产成人免费av一区二区午夜| 蜜桃视频一区二区三区| 成人va天堂| 精品网站999| 日韩精品视频一区二区三区| 久久精品国产精品亚洲毛片| 蜜臀av性久久久久蜜臀aⅴ流畅 | 日韩视频中文| 日韩二区三区四区| 日韩欧美四区| 亚洲播播91| 精品三级av在线导航| 国产麻豆一区二区三区精品视频| 久久婷婷久久| 91久久黄色| 欧洲在线一区| 日韩欧美一区二区三区免费观看| 老牛国内精品亚洲成av人片| 日本午夜精品久久久久| 日本免费在线视频不卡一不卡二| 美女一区网站| 亚洲日产av中文字幕| 狠狠操综合网| 亚洲一区日韩| 视频一区欧美精品| 午夜日韩在线| 午夜一级久久| 亚洲免费毛片| 国产精品任我爽爆在线播放 | 国产白浆在线免费观看| av日韩中文| 群体交乱之放荡娇妻一区二区| 日韩天堂在线| 日韩一级不卡| 日韩精品午夜视频| 久久香蕉网站| 久久一区二区三区喷水| 日韩视频精品在线观看| 国产高清精品二区| 成人国产综合| 特黄特色欧美大片| 免费日韩av片| 国产精品任我爽爆在线播放 | 国产精品nxnn| caoporn视频在线| 亚洲一级高清| 日韩精品a在线观看91| 精品国产欧美日韩一区二区三区| 日韩黄色大片| 亚洲精品日本| 亚洲精品永久免费视频| 久久精品99久久无色码中文字幕| 蜜桃av一区二区三区电影| 99热精品在线观看| 一区二区三区午夜视频| 日本不卡不码高清免费观看| 国语精品一区| 热久久久久久久| 国产专区精品| 亚州精品视频| 伊人久久婷婷| 欧美黑人巨大videos精品| 在线观看免费一区二区| 国产精品视频一区二区三区四蜜臂| 精品亚洲美女网站| 国产精品极品国产中出| 久久蜜桃资源一区二区老牛| 国产日韩视频在线| 少妇精品久久久| 亚洲男女av一区二区| 精品亚洲a∨一区二区三区18| 视频一区二区中文字幕| 欧美日韩在线二区| 国产一区二区三区国产精品| 亚洲免费毛片| 蜜桃av一区| 欧美日韩在线二区| 欧美日韩激情| 欧美日韩国产一区二区三区不卡| 开心激情综合| 日本一不卡视频| 欧美日韩精品免费观看视欧美高清免费大片 | 国产精品二区不卡| 91精品国产自产精品男人的天堂 | 日本亚州欧洲精品不卡| 99热精品在线观看| 久久男人av资源站| 精品国产午夜| 精品国产中文字幕第一页| 国产精品欧美三级在线观看| 欧美日韩a区| 老鸭窝一区二区久久精品| 国产伦乱精品| 国产一区一一区高清不卡| 国产精品www.| 国产成人精品三级高清久久91| 日韩不卡一区| 久久一区二区中文字幕| 欧美日韩国产在线一区| 视频一区免费在线观看| 日韩有码av| 日韩av一二三| 免费在线亚洲欧美| 久久精品电影| 久久先锋影音| 国产日韩欧美一区二区三区在线观看| 91精品麻豆| 国产不卡人人| 快she精品国产999| 欧美韩一区二区| 在线日韩电影| 日本亚洲不卡| 在线中文字幕播放| 亚洲综合日本| 欧美日韩亚洲国产精品| 麻豆免费精品视频| 精品视频在线观看网站| 久久精品亚洲欧美日韩精品中文字幕| 亚洲精品123区| 精品亚洲免a| 婷婷视频一区二区三区| 伊人久久视频| 国产三级精品三级在线观看国产| 久久精品卡一| 欧美激情综合| 中文字幕av亚洲精品一部二部| 伊伊综合在线| 国产精品欧美一区二区三区不卡| 欧美日韩水蜜桃| 精品资源在线| 欧美日韩a区| 国内精品福利| 日韩欧美看国产| 美腿丝袜亚洲一区| 色综合视频一区二区三区日韩 | 国产精品资源| 日本一区二区中文字幕| 999久久久91| 久久免费精品| 国产精品视频首页| 国产亚洲精品自拍| 久久精品电影| 欧美国产美女| 精品美女久久| 精品视频自拍| 精品资源在线| 日韩av有码| 久久久久观看| 亚洲精品高潮| 日韩不卡一区| a国产在线视频| 麻豆91小视频| 日本一区二区高清不卡| 牛牛精品成人免费视频| 国产美女撒尿一区二区| 亚洲精选久久| 亚洲精品系列| 国产亚洲观看| 成人亚洲一区|