事前取得とは、画面に表示される前にデータを取得することを意味します。この記事では、ルーティングを変更する前にデータを取得する方法を説明します。この記事では、 resolver
の使用方法、 Angular App
でのresolver
の適用方法、およびそれらを共通のプリロードされたナビゲーションに適用する方法を学習します。 [関連チュートリアルの推奨:「angular チュートリアル」]
Resolver
を使用する理由 リゾルバーResolver
ルーティングとコンポーネントの間のミドルウェア サービスの役割を果たします。データのないフォームがあり、ユーザーに空のフォームを表示し、ユーザー データのロード中にloader
を表示し、データが返されたときにフォームにデータを入力してloader
非表示にするとします。
通常、コンポーネントのngOnInit()
フック関数でデータを取得します。つまり、コンポーネントがロードされた後、データリクエストを開始します。
ngOnInit()
で操作する場合、必要な各コンポーネントがロードされた後、ルーティング ページにloader
表示を追加する必要があります。 Resolver
と、 loader
の追加と使用を簡素化できます。すべてのルートにloader
追加する代わりに、ルートごとに 1 つのloader
を追加するだけで済みます。
この記事では、例を使用して、 resolver
の知識ポイントを分析します。それを覚えてプロジェクトで使用できるようにします。
Resolver
使用するアプリケーションでresolver
使用するには、いくつかのインターフェイスを準備する必要があります。自分で開発しなくても、JSONPlaceholder を通じてシミュレートできます。
JSONPlaceholder
、インターフェイスに制約されることなく、フロントエンドの関連概念をより良く学習するために使用できる優れたインターフェイス リソースです。
インターフェイスの問題が解決されたので、 resolver
アプリケーションを開始できます。 resolver
はミドルウェアサービスなのでサービスを作成します。
$ ng gssolvers/demo-resolver --skipTests=true
--skipTests=true は、テスト ファイルの生成をスキップします
。サービスはsrc/app/resolvers
フォルダーに作成されます。 resolver
インターフェイスには、 resolve()
メソッドがあり、 route
( ActivatedRouteSnapshot
のインスタンス) とstate
( RouterStateSnapshot
のインスタンス) の 2 つのパラメーターがあります。
通常、 loader
すべてのAJAX
リクエストをngOnInit()
に書き込みますが、ロジックはngOnInit()
の代わりにresolver
に実装されます。
次に、 JSONPlaceholder
にリストデータを取得するサービスを作成します。次に、 resolver
内でそれを呼び出し、 resolver
が処理されるまでルート内でresolve
情報を構成します (ページは待機します)。 resolver
が処理された後、ルーティングを通じてデータを取得し、コンポーネントに表示できます。
$ ng gs services/posts --skipTests=true
サービスが正常に作成されたので、次はAJAX
リクエストのロジックを作成します。
model
を使用すると、エラーを減らすことができます。
$ ng g class models/post --skipTests=true
post.ts
エクスポート クラス Post { id: 番号; タイトル: 文字列; 本体: 文字列; ユーザー ID: 文字列; モデル
model
準備ができたので、 post
のデータを取得します。
post.service.ts
import { Injectable } from "@angular/core"; import { HttpClient } から "@angular/common/http"; import { Post } から "../models/post"; @Injectable({ 指定: "ルート" }) エクスポート クラス PostsService { コンストラクター(private _http: HttpClient) {} getPostList() { URL = "https://jsonplaceholder.typicode.com/posts"; return this._http.get<Post[]>(URL); } これ
で、このサービスはいつでも呼び出すことができます。
demo-resolver.service.ts
import { Injectable } from "@angular/core"; 輸入 { 解決する、 アクティブ化されたルートスナップショット、 ルーター状態スナップショット "@angular/router" から; import { PostsService } から "../services/posts.service"; @Injectable({ 指定: "ルート" }) エクスポート クラス DemoResolverService は Resolve<any> {を実装します。 コンストラクター(private _postsService: PostsService) {} solve(ルート: ActivatedRouteSnapshot、状態: RouterStateSnapshot) { this._postsService.getPostList() を返します。 } リゾルバー
resolver
返されたポストリストデータ。ここで、 resolver
を構成し、ルートからデータを取得し、コンポーネントにデータを表示するためのルートが必要です。配線ジャンプを実行するには、コンポーネントを作成する必要があります。
$ ng gcComponents/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 ルート: ルート = [ { パス: "投稿", コンポーネント: PostListComponent、 解決する: { 投稿: DemoResolverService } }、 { パス: ""、 リダイレクト先: "投稿", パスマッチ: "フル" } ]; @NgModule({ インポート: [RouterModule.forRoot(ルート)]、 エクスポート: [ルーターモジュール] }) import class AppRoutingModule {}
ルーティング構成にresolve
が追加されました。これにより、 HTTP
リクエストが開始され、 HTTP
リクエストが正常に返されたときにコンポーネントが初期化できるようになります。ルートは、 HTTP
リクエストによって返されたデータを組み立てます。
リクエストが進行中であることをユーザーにAppComponent
loader
必要に応じてカスタマイズできます。
app.component.html
<div class="loader" *ngIf="isLoader"> <div>読み込み中...</div> </div> <router-outlet></router-outlet>
app.component.ts
import { Component } from "@angular/core"; 輸入 { ルーター、 ルーターイベント、 ナビゲーション開始、 ナビゲーション終了 "@angular/router" から; @成分({ セレクター: "アプリルート", templateUrl: "./app.component.html", styleUrls: ["./app.component.scss"] }) エクスポート クラス AppComponent { isLoader: ブール値; コンストラクター(private _router: ルーター) {} ngOnInit() { this.routerEvents(); } routerEvents() { this._router.events.subscribe((イベント: RouterEvent) => { スイッチ (真) { NavigationStart のケース イベント インスタンス: { this.isLoader = true; 壊す; } NavigationEnd のケース イベント インスタンス: { this.isLoader = false; 壊す; } } }); }ナビゲーションが開始されると
、
isLoader
値にtrue
が割り当てられ、ページに次の効果が表示されます。
resolver
処理が完了すると、リゾルバは非表示になります。
次に、ルートから値を取得して表示します。
port-list.component.ts
import { Component, OnInit } from "@angular/core"; import { Router, ActivatedRoute } from "@angular/router"; import { Post } から "src/app/models/post"; @成分({ セレクター: "アプリポストリスト", templateUrl: "./post-list.component.html", styleUrls: ["./post-list.component.scss"] }) エクスポート クラス PostListComponent は OnInit を実装します { 投稿: 投稿[]; コンストラクター(private _route: ActivatedRoute) { this.posts = []; } ngOnInit() { this.posts = this._route.snapshot.data["投稿"]; }上に示した
よう
に、 post
の値はActivatedRoute
のスナップショット情報data
から取得されます。どちらの値もルートに同じ情報を設定すれば取得可能です。
HTML
では次のようにレンダリングします。
<div class="post-list グリッドコンテナ"> <div class="card" *ngFor="投稿を投稿する"> <div class="title"><b>{{post?.title}}</b></div> <div class="body">{{post.body}}</div> </div> </div>
CSS
フラグメント スタイルを使用すると、見た目がさらに美しくなります。
ポートリスト.コンポーネント
.css .grid-container { 表示: グリッド; グリッド テンプレート列: calc(100% / 3) calc(100% / 3) calc(100% / 3); } .card { マージン: 10px; ボックスシャドウ: 黒 0 0 2px 0px; パディング: 10px;
ルートからデータを取得した後、スタイルを記述するには scss プリプロセッサを使用することをお勧めします。データはHTML
で表示され
ます
。
効果は次のとおりです: スナップショット。
この時点で、プロジェクトでresolver
使用する方法を学習しました。
ユーザー エクスペリエンス デザインと組み合わせ、 resolver
を利用すると、アプリケーションのパフォーマンスを向上させることができます。詳細については、公式 Web サイトをご覧ください。
この記事は、個人的な理解とコメントを追加した自由翻訳による翻訳です。元のアドレスは、https:
//www.pluralsight.com/guides/prefetching-data-for-an-angular-route
です。