如何 link 子实体中的父级 - ngrx,ngrx/data
How to link parent in child entity - ngrx, ngrx/data
我正在为一家旅行社开发一个 Angular 应用程序。
在酒店列表页面中,我需要显示酒店的国家和城市。
我从 ngrx/data EntityService 获取国家、城市和酒店数据。
如果我使用嵌套订阅,它工作正常,但我确信有更好的方法。
这是我当前的实现
this.countryService.entities$.pipe(map((countries: Country[]) => countries)).subscribe((countries) => {
this.countries = countries;
this.cityService.entities$.pipe(map((cities) => cities)).subscribe((cities) => {
this.cities = cities;
this.hotelService.entities$.pipe(map((hotels) => hotels)).subscribe((hotels) => {
this.hotels = hotels.map((hotel) => {
return {
...hotel,
country: this.countries.find((c) => c.id === hotel.countryId),
city: this.cities.find((c) => c.id === hotel.cityId),
};
});
});
});
});
任何人都可以为上述解决方案提出更好的替代方案
您可以使用 zip 运算符来合并可观察对象。还有其他一些,例如 combineLatest、merge 等。阅读官方文档并决定您要自己使用哪个。
zip(this.countryService.entities$, this.cityService.entities$, this.hotelService.entities$).pipe(map(response => {
return {
countries: response[0],
cities: response[1],
hotels: response[2],
};
}).subscribe((respObj: {countries: Countries[], cities: Cities[], hotels: Hotels[]}) => {
this.countries = respObj.countries;
this.cities = respObj.cities;
this.hotels = respObj.this.hotels;
}));
PS:这是未经测试的代码。刚刚重构。
我会使用 rxjs combineLatest 运算符来订阅多个可观察对象。以下是使用 combineLatest 运算符的代码说明。
combineLatest([
this.countryService.entities$,
this.cityService.entities$,
this.hotelService.entities$
]).subscribe(([countries, cities, hotels]) => {
this.countries = countries;
this.cities = cities;
this.hotels = hotels.map((hotel) => {
return {
...hotel,
country: this.countries.find((c) => c.id === hotel.countryId),
city: this.cities.find((c) => c.id === hotel.cityId)
}
});
});
我正在为一家旅行社开发一个 Angular 应用程序。 在酒店列表页面中,我需要显示酒店的国家和城市。 我从 ngrx/data EntityService 获取国家、城市和酒店数据。
如果我使用嵌套订阅,它工作正常,但我确信有更好的方法。
这是我当前的实现
this.countryService.entities$.pipe(map((countries: Country[]) => countries)).subscribe((countries) => {
this.countries = countries;
this.cityService.entities$.pipe(map((cities) => cities)).subscribe((cities) => {
this.cities = cities;
this.hotelService.entities$.pipe(map((hotels) => hotels)).subscribe((hotels) => {
this.hotels = hotels.map((hotel) => {
return {
...hotel,
country: this.countries.find((c) => c.id === hotel.countryId),
city: this.cities.find((c) => c.id === hotel.cityId),
};
});
});
});
});
任何人都可以为上述解决方案提出更好的替代方案
您可以使用 zip 运算符来合并可观察对象。还有其他一些,例如 combineLatest、merge 等。阅读官方文档并决定您要自己使用哪个。
zip(this.countryService.entities$, this.cityService.entities$, this.hotelService.entities$).pipe(map(response => {
return {
countries: response[0],
cities: response[1],
hotels: response[2],
};
}).subscribe((respObj: {countries: Countries[], cities: Cities[], hotels: Hotels[]}) => {
this.countries = respObj.countries;
this.cities = respObj.cities;
this.hotels = respObj.this.hotels;
}));
PS:这是未经测试的代码。刚刚重构。
我会使用 rxjs combineLatest 运算符来订阅多个可观察对象。以下是使用 combineLatest 运算符的代码说明。
combineLatest([
this.countryService.entities$,
this.cityService.entities$,
this.hotelService.entities$
]).subscribe(([countries, cities, hotels]) => {
this.countries = countries;
this.cities = cities;
this.hotels = hotels.map((hotel) => {
return {
...hotel,
country: this.countries.find((c) => c.id === hotel.countryId),
city: this.cities.find((c) => c.id === hotel.cityId)
}
});
});