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

У меня вопрос о маршрутизации в Angular 4, особенно о разрешении данных.

Мое приложение значительно выиграет, если будет реализован преобразователь маршрутов; однако я работаю над сложным веб-приложением, и на одном из моих маршрутов (на странице контактов) отображается несколько компонентов, каждый из которых имеет свой служебный вызов в серверной части. Каждый вызов реализует другой интерфейс. Это связано с ограничениями базы данных.

Могу ли я написать по одному преобразователю для каждой из моих служб, или мне нужно написать преобразователь для каждого вызова службы, реализующего новый интерфейс?


person CMR    schedule 18.01.2018    source источник
comment
Я не уверен, что полностью понял вопрос, но если бы понял, вы можете написать один преобразователь для всего маршрута для компонента страницы, в котором размещены все упомянутые подкомпоненты. В этом преобразователе вы должны использовать Observable.forkJoin, чтобы дождаться завершения всех ваших вызовов api. Затем в компоненте главной страницы вы можете просто передать отдельные фрагменты данных в подкомпоненты, которые в них нуждаются.   -  person matmo    schedule 18.01.2018
comment
Итак, я могу комбинировать разные вызовы API, каждый из которых возвращает разные данные с помощью Observable.ForJoin? Если да, то это должно ответить на мой вопрос.   -  person CMR    schedule 18.01.2018
comment
Я провел небольшое исследование ForkJoin и думаю, что это именно то, что мне нужно. Если вы измените свой комментарий на ответ, я отмечу его как правильный.   -  person CMR    schedule 18.01.2018


Ответы (1)


Вы можете делать все в одном резолвере, например:

resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<any> {

     return Observable.forkJoin(
         this.someService.apiCallA(),
         this.someService.apiCallB(),
         this.someService.apiCallC(),
      )
      .map(([resA, resB, resC]: [ResponseAType, ResponseBType, ResponseCType]) => {
            return {
               aData: resA,
               bData: resB,
               cData: resC
            };

      });

}

Затем в компоненте главной страницы:

constructor(private aRoute: ActivatedRoute) {

      aRoute.data.subscribe((data: any) => {
         // You can find aData, bData, and cData here inside of data
         // Pass them down into the components that need them
      });

   }
person matmo    schedule 18.01.2018