الجلب المسبق يعني الحصول على البيانات قبل عرضها على الشاشة. ستتعلم في هذه المقالة كيفية الحصول على البيانات قبل إجراء تغييرات التوجيه. من خلال هذه المقالة، ستتعلم كيفية استخدام resolver
، وتطبيق resolver
في Angular App
، وتطبيقها على التنقل الشائع المحمل مسبقًا. [توصية تعليمية ذات صلة: "البرنامج التعليمي الزاوي"]
Resolver
يلعب Resolver
دور خدمة البرامج الوسيطة بين التوجيه والمكونات. لنفترض أن لديك نموذجًا لا يحتوي على بيانات، وتريد تقديم نموذج فارغ للمستخدم، وعرض loader
أثناء تحميل بيانات المستخدم، ثم عند إرجاع البيانات، قم بملء النموذج وإخفاء loader
.
عادة، نحصل على البيانات في وظيفة ربط ngOnInit()
الخاصة بالمكون. بمعنى آخر، بعد تحميل المكون، نبدأ طلب بيانات.
عند التشغيل في ngOnInit()
، نحتاج إلى إضافة عرض loader
إلى صفحة التوجيه الخاصة به بعد تحميل كل مكون مطلوب. يمكن Resolver
تبسيط عملية إضافة واستخدام loader
. بدلاً من إضافة loader
إلى كل مسار، يمكنك فقط إضافة loader
واحدة لكل مسار.
ستستخدم هذه المقالة أمثلة لتحليل نقاط المعرفة الخاصة resolver
. حتى تتمكن من تذكرها واستخدامها في مشاريعك.
Resolver
في التطبيقاتلاستخدام resolver
في التطبيقات، تحتاج إلى إعداد بعض الواجهات. يمكنك محاكاته من خلال JSONPlaceholder دون تطويره بنفسك.
يعد JSONPlaceholder
موردًا رائعًا للواجهة، ويمكنك استخدامه لتعلم المفاهيم ذات الصلة بالواجهة الأمامية بشكل أفضل دون التقيد بالواجهة.
الآن بعد أن تم حل مشكلة الواجهة، يمكننا بدء تطبيق resolver
. resolver
عبارة عن خدمة وسيطة، لذلك سنقوم بإنشاء خدمة.
$ ng gs Resolvers/demo-resolver --skipTests=true
--skipTests=true يتخطى
إنشاء ملفات src/app/resolvers
. توجد طريقة resolve()
في واجهة resolver
، والتي تحتوي على معلمتين: route
(مثيل لـ ActivatedRouteSnapshot
) state
(مثيل لـ RouterStateSnapshot
).
عادةً ما يكتب loader
جميع طلبات AJAX
في ngOnInit()
، ولكن سيتم تنفيذ المنطق في resolver
بدلاً من ngOnInit()
.
بعد ذلك، قم بإنشاء خدمة للحصول على بيانات القائمة في JSONPlaceholder
. ثم اتصل به في resolver
، ثم قم بتكوين معلومات resolve
في المسار (ستنتظر الصفحة) حتى تتم معالجة resolver
. بعد معالجة resolver
، يمكننا الحصول على البيانات من خلال التوجيه وعرضها في المكون.
$ ng gs Services/posts --skipTests=true
الآن بعد أن أنشأنا الخدمة بنجاح، حان الوقت لكتابة المنطق لطلب AJAX
.
يمكن أن يساعدنا استخدام model
في تقليل الأخطاء.
$ ng g classmodels/post --skipTests=true
post.ts
فئة التصدير Post { id: number; العنوان: سلسلة؛ الجسم: سلسلة؛ معرف المستخدم: سلسلة؛ }
model
جاهز، حان وقت الحصول على بيانات post
.
post.service.ts
import {Injectable} من "@angular/core"; استيراد {HttpClient} من "@angular/common/http"; استيراد {منشور} من "../models/post"; @الحقن({ المقدمة في: "الجذر" }) فئة التصدير PostService { منشئ (خاص _http: HttpClient) {} الحصول على بوستليست () { Let URL = "https://jsonplaceholder.typicode.com/posts"; إرجاع هذا._http.get<Post[]>(URL); } }
الآن، يمكن استدعاء هذه الخدمة في أي وقت.
demo-resolver.service.ts
import { Injectable } من "@angular/core"; يستورد { حل، لقطة الطريق المنشط، RouterStateSnapshot } من "@angular/router"; استيراد { PostsService } من "../services/posts.service"؛ @الحقن({ المقدمة في: "الجذر" }) فئة التصدير DemoResolverService تنفذ Resolve<any> { منشئ (خدمة _postsService: PostsService) {} حل (الطريق: ActivatedRouteSnapshot، الحالة: RouterStateSnapshot) { إرجاع this._postsService.getPostList(); } }
تم إرجاع بيانات قائمة النشر من resolver
. الآن، أنت بحاجة إلى مسار لتكوين resolver
، والحصول على البيانات من المسار، ثم عرض البيانات في المكون. من أجل تنفيذ قفزات التوجيه، نحتاج إلى إنشاء مكون.
$ ng gc Components/post-list --skipTests=true
لجعل المسار مرئيًا، قم بإضافة router-outlet
في app.component.ts
.
<router-outlet></router-outlet>
الآن، يمكنك تكوين ملف app-routing.module.ts
. سيساعدك مقتطف التعليمات البرمجية التالي على فهم resolver
تكوين المسار.
app-routing-module.ts
import { NgModule } من "@angular/core"; استيراد {الطرق، RouterModule} من "@angular/router"؛ استيراد { PostListComponent } من "./components/post-list/post-list.component"؛ استيراد { DemoResolverService } من "./resolvers/demo-resolver.service"؛ طرق ثابتة: طرق = [ { المسار: "المشاركات"، المكون: PostListComponent، الحل: { المشاركات: DemoResolverService } }, { طريق: ""، إعادة التوجيه إلى: "المشاركات"، pathMatch: "كامل" } ]; @NgModule({ الواردات: [RouterModule.forRoot(routes)]، الصادرات: [وحدة التوجيه] }) فئة التصدير AppRoutingModule {}
تمت إضافة resolve
إلى تكوين التوجيه، والذي سيبدأ طلب HTTP
ثم يسمح للمكون بالتهيئة عندما يعود طلب HTTP
بنجاح. سيقوم المسار بتجميع البيانات التي يتم إرجاعها بواسطة طلب HTTP
.
لإظهار المستخدم أن الطلب قيد التقدم، نكتب loader
عامًا وبسيطًا في AppComponent
. يمكنك تخصيصه حسب الحاجة.
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: منطقي؛ منشئ (جهاز التوجيه الخاص: جهاز التوجيه) {} نجونينيت () { this.routerEvents(); } أحداث التوجيه () { this._router.events.subscribe((الحدث: RouterEvent) => { التبديل (صحيح) { مثيل حدث الحالة لـ NavigationStart: { this.isLoader = true; استراحة؛ } مثيل حدث الحالة لـ NavigationEnd: { this.isLoader = false; استراحة؛ } } }); } }
عندما يبدأ التنقل، يتم تعيين قيمة isLoader
true
، وسترى التأثير التالي على الصفحة.
عند الانتهاء من معالجة resolver
، سيتم إخفاؤه.
حان الوقت الآن للحصول على القيمة من المسار وعرضها.
port-list.component.ts
import { Component, OnInit } من "@angular/core"; استيراد {جهاز التوجيه، ActivatedRoute} من "@angular/router"؛ استيراد { منشور } من "src/app/models/post"; @عنصر({ المحدد: "قائمة ما بعد التطبيق"، templateUrl: "./post-list.component.html"، styleUrls: ["./post-list.component.scss"] }) فئة التصدير PostListComponent تنفذ OnInit { المشاركات: مشاركة[]; منشئ (طريق _ خاص: ActivatedRoute) { this.posts = []; } نجونينيت () { this.posts = this._route.snapshot.data["posts"]; } }
كما هو موضح أعلاه، تأتي قيمة post
من data
معلومات اللقطة الخاصة بـ ActivatedRoute
. يمكن الحصول على هاتين القيمتين طالما قمت بتكوين نفس المعلومات في المسار.
نعرض كما يلي في HTML
.
<div class="حاوية شبكة ما بعد القائمة"> <div class="card" *ngFor="السماح بنشر المشاركات"> <div class="title"><b>{{post?.title}}</b></div> <div class="body">{{post.body}}</div> </div> </div>
أنماط أجزاء CSS
تجعلها تبدو أكثر جمالاً.
port-list.component.css
.grid-container { العرض: الشبكة؛ أعمدة قالب الشبكة: calc(100% / 3) calc(100% / 3) calc(100% / 3); } .بطاقة { الهامش: 10 بكسل؛ صندوق الظل: أسود 0 0 2px 0px؛ الحشو: 10 بكسل؛ }
يوصى باستخدام معالج scss لكتابة الأنماط
بعد الحصول على البيانات من المسار، سيتم عرضها بتنسيق HTML
. التأثير كما يلي: لقطة.
في هذه المرحلة، تعلمت كيفية استخدام resolver
في مشروعك.
بالاشتراك مع تصميم تجربة المستخدم وبمساعدة resolver
، يمكنك تحسين أداء التطبيق الخاص بك. لمعرفة المزيد، يمكنك زيارة الموقع الرسمي.
هذه المقالة مترجمة، باستخدام ترجمة مجانية، مع إضافة فهم شخصي وتعليقات. العنوان الأصلي هو:
https://www.pluralsight.com/guides/prefetching-data-for-an-angular-route.