Rxjs - переназначение наблюдаемого - PullRequest
0 голосов
/ 26 февраля 2019

Я использую Angular 7 и пытаюсь получить данные из моих маршрутов.

Мои ленивые загруженные маршруты настроены так:

  {
    data: { menuItems: DASHBOARD_MENU_ITEMS },
    path: 'dashboard',
    loadChildren: './modules/dashboard/dashboard.module#DashboardModule',
  },
  {
    data: { menuItems: ADMIN_MENU_ITEMS },
    path: 'admin', 
    loadChildren: './modules/admin/admin.module#AdminModule' 
  }

И у меня есть наблюдаемое, чтобы получить эти данные примерно так:

menuItems$: Observable<any[]>;

В одном измои компоненты, у меня есть следующее:

this.menuItems$ = this.route.firstChild.firstChild.data;

    this.menuItems$ = this.router.events.pipe(
      // startWith(this.route.firstChild.firstChild.data),
      filter(e => e instanceof RoutesRecognized),
      map((event: RoutesRecognized) => {
        console.log(event.state.root.firstChild.firstChild.firstChild.data)
        return event.state.root.firstChild.firstChild.firstChild.data as NbMenuItem[];
      }));

Но это не работает для меня, так как я считаю, что переназначаю свою наблюдаемую переменную menuItems$.

Мне нужно сделать этотак как мне нужно получить данные, как при первом попадании на маршрут (который не вызывает событие с this.router.events), так и каждый раз, когда пользователь перемещается.

Если я использую нотацию .subscribe(), то она работает нормально, но я не хочу этого делать.Что я тут не так делаю?

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Я полагаю, что вы передаете Observable в startWith, а не проходите начальное состояние.Вы можете получить исходное состояние, используя свойство snapshot.

Вам также нужно будет поставить оператор startWith после filter и map.

const initialMenuItems = this.route.firstChild.firstChild.snapshot.data;

this.menuItems$ = this.router.events.pipe(
  filter(e => e instanceof RoutesRecognized),
  map((event: RoutesRecognized) => {
    console.log(event.state.root.firstChild.firstChild.firstChild.data);
    return event.state.root.firstChild.firstChild.firstChild.data as NbMenuItem[];
  }),
  startWith(this.route.firstChild.firstChild.data)
);
0 голосов
/ 26 февраля 2019

Я думаю, что вы хотите использовать shareReplay(), чтобы наблюдаемое воспроизводило последнее испущенное значение.

https://www.learnrxjs.io/operators/multicasting/sharereplay.html

this.menuItems$ = this.router.events.pipe(
  filter(e => e instanceof RoutesRecognized),
  map((event: RoutesRecognized) => event.state.root.firstChild.firstChild.firstChild.data),
  startWith(this.route.firstChild.firstChild.data),
  shareReplay(1)
);

Вам также следует переместить startWith() послеfilter(), чтобы фильтр не удалил первое значение.

Я не совсем уверен, что вышеприведенное верно.Я просто догадываюсь.

...