Ну, сначала я бы изменил то, как вы заводите ребенка. Прямо сейчас, каждый раз, когда вам нужен 1 ребенок, вы снова получаете полный список с сервера, а затем фильтруете его. Вы также можете просто получить их все в одном go и сохранить их как переменную в сервисе, чтобы к ним можно было получить доступ позже, или иметь подходящий метод для получения одного дочернего элемента с сервера по запросу, если данные могут становится устаревшим.
Вы можете решить это в будущем, но, сохраняя текущий код как есть, поможет изменение материнского преобразования для возврата наблюдаемого.
export class MotherTransformerService {
constructor(
private childService: ChildService
) {
}
/**
* Mutate `Mother` to fit application needs.
*
* @param apiModel: ApiMother
* @return Mother
*/
fromApiModel(apiModel: ApiMother): Observable<Mother> {
let model = new Mother;
const child: Observable<Child> = this.childService.findOne(apiModel.child);
return child.pipe(map(c => {
model = {
id: apiModel.id,
child: c,
};
return model;
});
}
}
Теперь, когда fromApiModel for mother является Observable, мы будем использовать switchMap вместо map
export class MotherService extends BaseApiService {
constructor(
private http: HttpClient,
private transformer: MotherTransformerService,
) {
super(auth);
}
/**
* Return list of mothers.
*
* @return An `Observable` of `Mother` for the request, with a response body in JSON.
*/
public getAll(): Observable<Mother[]> {
return this.http
.get<ApiMother[]>(this.url)
.pipe(switchMap(
obj => this.transformer.fromApiModel(obj))
);
}
}
Теперь у нас есть Mother.child: Child
вместо Mother.child: Observable<Child>
.
Могут быть некоторые проблемы с импортом или небольшой синтаксис проблемы, поскольку это не в блиц-стеке для проверки, но, основываясь на вашем текущем коде, я думаю, вы, вероятно, могли бы понять это отсюда.