久久精品五月,日韩不卡视频在线观看,国产精品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综合
欧美视频精品全部免费观看| 伊人国产精品| 亚洲精品自拍| 免费人成精品欧美精品| 老鸭窝毛片一区二区三区| 精品中文一区| 999视频精品| 一区二区小说| 老鸭窝毛片一区二区三区| 蜜桃91丨九色丨蝌蚪91桃色 | 综合国产视频| 日本亚洲三级在线| 亚洲免费一区三区| 欧美一级一区| 国产精品多人| 97精品国产一区二区三区 | 91精品啪在线观看国产18| av亚洲在线观看| 亚洲欧美日韩国产| 亚洲精品福利| 国产精品黄网站| 成人小电影网站| 欧美日韩国产一区精品一区| 中文字幕亚洲精品乱码| 亚洲精品影视| 国产劲爆久久| 日韩免费福利视频| 国产女优一区| 国产精品资源| 日韩伦理在线一区| 亚洲永久字幕| 国产乱码精品一区二区亚洲| 国内自拍视频一区二区三区| 久久影视一区| 日韩精品欧美大片| 久久伊人久久| 精品一区免费| 91国内精品| 香蕉视频亚洲一级| 亚洲一区亚洲| 久久99偷拍| 1000部精品久久久久久久久| 亚洲男人在线| 国产不卡一区| 午夜在线一区| 国产免费av一区二区三区| 色婷婷亚洲mv天堂mv在影片| 亚洲免费观看| 麻豆一区在线| 午夜在线精品偷拍| 欧美成人精品午夜一区二区| 亚洲第一精品影视| 欧美日韩一视频区二区| 久久国产欧美| 日韩久久99| 久久激情婷婷| 久久国产欧美日韩精品| 少妇精品导航| 国产亚洲精品精品国产亚洲综合 | 国产精成人品2018| 影音国产精品| 国产精品成人一区二区网站软件| 欧美午夜精品一区二区三区电影| 91精品国产自产观看在线| 天堂资源在线亚洲| 国产精品成人自拍| 久久成人国产| 亚洲国产福利| 日韩精品免费观看视频| 999久久久91| 久久超级碰碰| 日韩中文字幕1| 成人啊v在线| 国产精品chinese| 免费观看久久久4p| 欧美色图国产精品| 牛牛精品成人免费视频| 噜噜噜躁狠狠躁狠狠精品视频| 久久久久亚洲精品中文字幕| 在线精品视频一区| 极品裸体白嫩激情啪啪国产精品| 九九九精品视频| 日韩成人精品一区二区三区| 免费不卡中文字幕在线| 水蜜桃久久夜色精品一区| 日本成人一区二区| 在线亚洲自拍| 中文字幕系列一区| 久久一区精品| 久久国产欧美日韩精品| 欧美专区一区二区三区| 亚洲精品一级二级| 久久久久97| 国产精品主播| 日韩av资源网| 中文无码久久精品| 欧美成人国产| 丝袜美腿一区| 久久精品理论片| 国产亚洲人成a在线v网站| 亚洲综合图色| 免费国产亚洲视频| 亚洲女同一区| 欧美在线观看视频一区| 中文在线免费视频| 国产不卡精品在线| 久久精品二区亚洲w码| 久久精品 人人爱| 亚洲不卡视频| 中文视频一区| 中文久久精品| 亚洲激情中文在线| 国产主播一区| 黑人精品一区| 成人综合一区| 福利视频一区| 加勒比视频一区| 麻豆精品久久久| 国产精品红桃| 麻豆精品视频在线观看| 久久国产成人午夜av影院宅| jizzjizz中国精品麻豆| 美女视频黄 久久| 久久亚洲欧美| 美女网站久久| 亚洲欧美视频| 在线一区二区三区视频| 国产精品av久久久久久麻豆网| 久久精品三级| 福利一区和二区| 日韩欧美午夜| 亚洲一级黄色| 久久www成人_看片免费不卡| 久久亚洲风情| 色综合视频一区二区三区日韩 | 久久精品国产亚洲夜色av网站| 天堂8中文在线最新版在线| 超碰在线99| 91精品国产自产在线观看永久∴ | 99久久精品费精品国产| 伊人久久大香线蕉av不卡| 亚洲一区区二区| 日本电影久久久| 免费日韩一区二区三区| 日本一区二区免费高清| 亚洲爱爱视频| 在线综合亚洲| 视频一区日韩| 国产欧美综合一区二区三区| 久久av免费看| 久久蜜桃精品| 中文字幕亚洲影视| 国产精品成人一区二区网站软件| 国产传媒在线观看| 99国产精品视频免费观看一公开| 一区二区不卡| 国产高清亚洲| 久久久久久久久久久妇女 | 蜜臀国产一区| 日韩欧美二区| 欧美网站在线| 日韩精品一区二区三区av| 美女视频网站久久| 91精品久久久久久久久久不卡| 免费在线观看一区二区三区| 国产精品久av福利在线观看| 久久精品亚洲人成影院| 亚洲精品成人一区| 精品一区视频| 日韩一级网站| 国产精品hd| 亚洲午夜91| 国产精品一区二区三区av麻| 日韩一区自拍| 亚洲精品动态| 视频在线不卡免费观看| 亚洲黄色在线| 你懂的国产精品| 欧美日韩免费观看一区=区三区| 日韩av电影一区| 日韩中文视频| 日本午夜精品一区二区三区电影| 国产欧美一区二区三区精品酒店| 丝袜美腿高跟呻吟高潮一区| 欧美国产亚洲精品| 亚洲成人日韩| 蜜桃久久久久| 蜜臀a∨国产成人精品| 国产成人免费精品| 中文字幕中文字幕精品| 国产成人久久精品麻豆二区 | 99在线精品视频在线观看| 国产视频网站一区二区三区| 成人在线免费观看91| 亚洲欧美视频一区二区三区| 国产欧美一级| 午夜欧美在线| 久久久久九九精品影院| 午夜视频精品| 久久亚州av|