Предварительное заполнение данных Angular для нескольких полей с использованием Resolver, Resolver вернет Observable внутри подписчика

В моем приложении Angular (8) нужно предварительно заполнить пару полей из службы (БД). пример использования: хотите предварительно заполнить адрес, квартиру и т. д. из БД по соответствующему пин-коду / почтовому индексу и получить этот почтовый индекс из другой службы.

Я пытался использовать Resolver

Маршрутизатор:

const routes: Routes = [
{
  path: 'my-form',
  component: MyFormComponent,
  resolve: { managers: ManagerResolver, locationTrack: LocationTrackResolver,savedAddress: AddressResolver}
},

в моем компоненте

this.managers= this.route.snapshot.data.managers;
    this.locationTrack = this.route.snapshot.data.locationTrack;
 this.savedAddress = this.route.snapshot.data.savedAddress;

И адрес Resolver: здесь один подписчик для получения пин-кода на основе местоположения и внутри подписчика другой Observable для получения данных.

@Injectable()
export class AddressResolver implements Resolve<Observable<PatientAddress>> {

   savedAddress: Observable<PatientAddress>;

  constructor(private addressService: AddressService, private locationMapService: LocationMapService) { }
  resolve(route: ActivatedRouteSnapshot): Observable<PatientAddress> {

    this.locationMapService.getLocation().subscribe(location => {

      this.savedAddress = this.addressService.getLastSavedAddressByPinCode(location.postal);
    });
    return this.savedAddress;
  }
}

person Manu    schedule 22.02.2020    source источник


Ответы (1)


Наблюдаемый является асинхронным, поэтому возврат this.savedAddress за пределы подписки не будет определен. Используйте switchMap для возврата внутреннего наблюдаемого, подобного этому

Попробуйте это:

   @Injectable()
    export class AddressResolver implements Resolve<Observable<PatientAddress>> {

      savedAddress: Observable<PatientAddress>;

      constructor(private addressService: AddressService, private locationMapService: LocationMapService) { }

      resolve(route: ActivatedRouteSnapshot): Observable<PatientAddress> {
       this.savedAddress = this.locationMapService.getLocation().pipe(switchMap(location => 
       this.addressService.getLastSavedAddressByPinCode(location.postal)));
       return this.savedAddress;
   }
 }
person Chellappan வ    schedule 22.02.2020
comment
Я рад, что смог помочь. - person Chellappan வ; 22.02.2020