Angular4 Извлекает данные перед навигацией по Route Resolve - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь использовать Angular Route Resolve для извлечения данных компонента перед активацией маршрута.

Все примеры, которые я видел, вызывают один метод в сервисе и возвращают, у меня есть 5 различных методов вСлужба, которую необходимо назвать b4, компонент активирован.

Ниже приведен пример того, чего я пытаюсь достичь, ContactService имеет 3 метода, которые необходимо вызвать всем - как я могу вернуть все 3 метода в одномЗвоните?

Любые указатели приветствуются.

Contact-Resolver.ts - ниже

import { Injectable } from '@angular/core';
import { Resolve, ActivatedRouteSnapshot } from '@angular/router';
import { ContactsService } from './contacts.service';

@Injectable()
export class ContactResolve implements Resolve<Contact>
{

  constructor(private contactsService: ContactsService) {}

  resolve(route: ActivatedRouteSnapshot)
  {
    return this.contactsService.getContact(route.paramMap.get('id')); //method in Service
  }

//  return this.contactsService.getCities(); //Another method in Service that also needs to be called

 // return this.contactsService.getAllParts(); //Another method in Service that also needs to be called


}

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Интерфейс Resolve определяется следующим образом:

interface Resolve<T> {
  resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<T> | Promise<T> | T
}

Метод resolve может возвращать Observable, Promise или просто объект некоторого типа.В вашем случае вы должны подписаться на контакты, города и части внутри ContactService.Когда все три фрагмента данных будут получены, объедините их в объект и верните в отдельном методе, например, getCombinedData, который можно вызвать из распознавателя.

Другой вариант - использовать RxJS forkJoin, как это было предложено Мартином, но если вы хотите подготовить структурированный объект с объединенными результатами, сделайте это вручную.

0 голосов
/ 07 июня 2018

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

resolve(route: ActivatedRouteSnapshot) {
  return Observable.forkJoin(
    this.contactsService.getContact(route.paramMap.get('id')),
    this.contactsService.getCities(),
    this.contactsService.getAllParts()
  );
}

Все результаты будут доступны в одном массиве из 3 элементов.

...