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 עובד (בין דברים אחרים) במאמר הזה.