Angular / RxJs 6 - объединение параметров маршрута и параметров запроса больше не работает - PullRequest
0 голосов
/ 11 мая 2018

Я потратил как минимум 2 часа, пытаясь заставить вещи работать с версией 6, но безрезультатно.Я просто не могу получить и параметры маршрута, и параметры запроса.

Это наиболее близкий синтаксис к более старым версиям, но он регистрирует только параметры запроса.

Я хочу обернуть это в службу глобальной маршрутизации.поэтому вызов метода является чистым, и если произойдут какие-либо другие обновления, я могу изменить их в одном месте.

    import {BehaviorSubject, combineLatest, Observable} from 'rxjs';

constructor(private router: Router, private route: ActivatedRoute)
// body of constructor left out


     // Combine them both into a single observable
    const urlParams: Observable<any> = combineLatest(
        this.route.params,
        this.route.queryParams,
        (params, queryParams) => ({ ...params, ...queryParams})
    );

    urlParams.subscribe(x => console.log(x));

Я также заметил, что CombinedLatest по какой-то причине отсутствует в 'rxjs / operator'.Observable.combineLatest также не работает.

Спасибо.

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

В rxjs6 больше нет селектора результатов, поэтому вам нужно использовать вместо него «map».Документация по миграции Руководство по миграции rxjs

import {BehaviorSubject, combineLatest, Observable} from 'rxjs';
import {map} from 'rxjs/operators'

    const urlParams: Observable<any> =  combineLatest(
        this.route.params,
        this.route.queryParams
      ).pipe(
          map(([params, queryParams]) => ({...params, ...queryParams}))
      );

    urlParams.subscribe(x => console.log(x));
0 голосов
/ 12 сентября 2018

Я наткнулся на ту же проблему и принятый вид работ, но если вы измените параметры маршрута и параметры запроса одновременно, подписка будет активирована дважды.Чтобы избежать этого, я использовал distinctUntilChanged:

combineLatest(
      this.route.params.pipe(distinctUntilChanged(), takeUntil(this.ngUnsubscribe)),
      this.route.queryParams.pipe(distinctUntilChanged(), takeUntil(this.ngUnsubscribe))
    )
      .pipe(map(([params, queryParams]) => ({params, queryParams})))
      .subscribe(({params, queryParams}) => {
         console.log(params, queryParams);
      });
0 голосов
/ 11 мая 2018

ОбъединитьПоследний обеспечивает один вывод в формате массива ... Пожалуйста, попробуйте использовать следующее

t$ = combineLatest(
  this.route.params,
  this.route.queryParams
).pipe(
  map(results => ({params: results[0], queryParams: results[1]}))
);
...