Доступ к параметрам маршрута без обещания Angular 6

Я использую Angular 6. Когда я хочу использовать параметры маршрута, я использую этот код:

this.route.params.subscribe(params => {
    // use params now as a object variable
});

Но мне нужно использовать параметры при вызове службы. Пример У меня есть сервис для получения информации о пользователе. И я вызываю эту службу внутри распознавателя. Если я хочу использовать подписку, я не могу вернуть результат службы:

resolve(route: ActivatedRouteSnapshot,state: RouterStateSnapshot): Observable<any> {
    this.route.params.subscribe(params => {
        return this.FixturesService.getFixtures(params);
    });    
});

Сейчас это не работает. В нем говорится:

Функция, объявленный тип которой не является ни «void», ни «any», должна возвращать значение.

Как я могу вернуть результат службы внутри функции разрешения с передачей параметров маршрута службе, которую я вызвал, и вернуть ее компоненту?


person Abdol Seed    schedule 19.06.2018    source источник


Ответы (1)


Вы можете решить эту проблему, используя switchMap, чтобы изменить наблюдаемые параметры маршрута на наблюдаемые вашей службы:

resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<any> {
  return route.params.switchMap(params => this.FixturesService.getFixtures(params));
}

Сервисный вызов не будет выполнен до тех пор, пока параметры не будут разрешены, после чего подписчики получат результат сервисного вызова.

Спасибо @JBNizet за исправление.

person Zircon    schedule 19.06.2018
comment
Если this.FixturesService.getFixtures() возвращает Observable, на самом деле это должен быть switchMap(), а не map(). И, @Sami, не используй any. Используйте правильный тип данных, возвращаемых службой. - person JB Nizet; 19.06.2018
comment
Пробовал карту и switchMap, но не помогло. Та же ошибка: vendor.js:32791 ERROR Error: Uncaught (in promise): TypeError: route.params.switchMap не является функцией TypeError: route.params.switchMap не является функцией - person Abdol Seed; 19.06.2018
comment
@JBNizet Какой тип следует использовать для объектов? - person Abdol Seed; 19.06.2018
comment
Возможно, вам придется импортировать оператор для switchMap, но это могло измениться в Angular 6, и я не знаю, как это сделать. - person Zircon; 19.06.2018
comment
На самом деле маршрут здесь имеет тип ActivatedRouteSnapshot, а не ActivatedRoute. Таким образом, параметры доступны напрямую. return this.FixturesService.getFixtures(route.params). angular.io/api/router/ActivatedRouteSnapshot#params - person JB Nizet; 19.06.2018
comment
Но у меня другая проблема. Я использую преобразователь и службу для привязки данных перед полной загрузкой маршрута для универсального углового. Я хочу привязать данные XHR к просмотру, когда я пытаюсь открыть исходную версию просмотра в универсальном угловом. - person Abdol Seed; 20.06.2018