У меня есть приложение Angular, где я извлекаю данные из API с помощью HttpClient.
Я хотел бы получить необработанные данные из API и отправить их в соответствующую службу. У служб есть методы, которые отображают необработанные данные для моделирования объектов и возвращают их компоненту.
Проблема в том, что я получаю данные из API (return Observable), я подписываюсь в методе службы, а затем я делаю не знаю, как передать данные компоненту.
Служба Api, где я извлекаю данные из API. Затем я отправляю необработанные данные и услуги отеля, где я хочу отображать необработанные данные для моделирования и отправки в компонент
@Injectable()
export class ApiService {
...
public getHotelById(hotelId: number): Observable<any> {
return this.http
.get(API_URL + '/hotel/' + hotelId)
.map((response) => {
return response;
})
}
...
}
@Injectable()
export class HotelService {
...
public getHotelById(id: number): Subscription {
return this.api.getHotelById(id).subscribe(
(response) => {
let hotel = new HotelModel(response.hotel);
hotel.mapCountry(response.country);
return hotel;
}
);
}
...
}
Может ли кто-нибудь помочь мне получить данные из службы в компоненте? Я получаю ошибку, что объект, который возвращает сервисный сервис, является подпиской, и я не могу подписаться на него.
Есть ли способ, как это сделать? Я не хочу делать какую-либо бизнес-логику в службе API. На этом месте я просто хочу получить данные.
Служба Api, где я извлекаю данные из API. Затем я отправляю необработанные данные и гостиничный сервис, где я хочу отображать необработанные данные для моделирования и отправки в компонент
ngOnInit() {
this.activatedRoute.queryParamMap.subscribe(
(map) => {
this.hotelId = this.activatedRoute.snapshot.params['id'];
this.hotel = this.hotelService.getHotelById(this.hotelId)
.subscribe(
(hotel) => {
this.hotel = hotel;
}
)
}
)
}
Я думаю, что хороший способ для вас - сопоставить свой результат с конкретной функцией «getHotelById» (вы делаете ORM как)
@Injectable()
export class ApiService {
...
public getHotelById(hotelId: number): Observable<any> {
return this.http
.get(API_URL + '/hotel/' + hotelId)
.map((response) => {
let hotel = new HotelModel(response.hotel);
hotel.mapCountry(response.country);
return hotel;
})
}
...
}
@Injectable()
export class HotelService {
...
public getHotelById(id: number): Observable<any> {
return this.api.getHotelById(id);
}
...
}
И в вашем компоненте ничего не меняется.
Вам действительно нужны две службы?
@Injectable()
export class HotelService extends AbstractHttpService {
constructor (
private httpClient: HttpClient,
) {
super();
}
loadHotels(): Observable<Hotel[]> {
const url = this.url('hotels');
return this.httpClient.get<Hotel[]>(url, this.standardHttpOptions);
}
}
В абстрактном классе есть некоторые помощники для запроса целевого URL-адреса и предоставляет стандартные параметры http для вызова get.