javascript - האם אנחנו צריכים RXJS combineLatest עם ActivateRouted.pathFromRoot?
יישום תיעוד Angular Material שולף פרמטרי מסלול ממודולים טעונים באופן עצלני כך:
https://github.com/angular/material.angular.io/blob/master/src/app/pages/component-category-list/component-category-list.ts
// Combine params from all of the path into a single object.
this.params = combineLatest(
this._route.pathFromRoot.map(route => route.params), Object.assign);
נראה שאין לנו באמת צורך ב-combineLatest בשביל זה?
ה-_route מוזן דרך הבנאי ואם הבנתי נכון, ברגע שהקומפוננטה מחזיקה את ההפניה אליו, מערך ה-pathFromRoot של מופע ה-ActivateRoute לא יכול להשתנות?
מכיוון שזה המצב, אנחנו לא צריכים את combineLatest?
אז נראה שנוכל לעשות משהו כזה במקום:
const paramArr = this._route.pathFromRoot.map(route => route.params)
this.params = of(Object.assign(paramArr))
זה הגיוני?
תשובה #1
ב
const paramArr = this._route.pathFromRoot.map(route => route.params)
pathFromRoute ולכן route לא ישתנה. אבל route.params הוא Observable וה-Observable הזה יכול לפלוט ערכים חדשים עם הזמן. כדי להתעדכן כאשר אחד מה-Observables האלה מפלוט ערך חדש, עליך להירשם לכל ה-Observables האלה. לכן משתמשים ב-combineLatest.
this.params = of(Object.assign(paramArr))
זה לא ממש מועיל. זה יוצר אובזרבבל שמשדר מערך של אובזרבבלים, אז תצטרך ליישר את האובזרבבל הזה בצעד נוסף. כשאתה משתמש ב-combineLatest לא תצטרך את הצעד הנוסף הזה.
תשובה #2
נראה שאין לנו באמת צורך ב-combineLatest בשביל זה?
אני אומר שזה נחוץ, אבל זה גם תלוי במה שתרצה להשיג.
לדוגמה, עם הגישה הזו:
const paramArr = this._route.pathFromRoot.map(route => route.params)
this.params = of(Object.assign(paramArr))
אתה תקבל את הפרמטרים מ-ActivatedRoute השורש אל יליד ה-ActivatedRoute הנוכחי פעם אחת בלבד. כלומר, אם ה-params של מסלול מתעדכנים (לדוגמה קודם אתה מנווט ל-/1, ואז ל-/2), תקבל רק את 1. בנוסף, אני לא בטוח שזה יעבוד כמו שציפו, מכיוון ש-paramsArr יהיה מערך של observables (ActivatedRoute.params הוא BehaviorSubject לפי מה שידוע לי).
זאת אם תשתמש בגישה הזו:
this.params = combineLatest(
this._route.pathFromRoot.map(route => route.params), Object.assign);
אתה תקבל הודעה על כל עדכוני params שמתרחשים בעץ ActivatedRoute, לא רק פעם אחת, אלא בכל פעם.
פירטתי איך ActivatedRoute עובד (בין דברים אחרים) במאמר הזה.
