我一直在努力解决以下问题。
...
export interface HotelRoomType {
foo: string;
boo: number;
rplans: Array<RatePlan>
}
export interface RatePlan {
prop1: string;
prop2: boolean;
prop3: number
}
doc1: HotelRoomType;
doc2: HotelRoomType;
doc3: HotelRoomType;
ratePlansArr$: Observable<RatePlan[]>;
...
doc1,doc2和doc3是
的Firestore文档/Company/CompanyId/Room_Types
子集合。
第一个文档如下
doc1 = {
foo: 'a',
boo: 1,
rplans: [
{
prop1: 'xxx',
prop2: true,
prop3: 512.50
},
{
prop1: 'yyy',
prop2: false,
prop3: 101
}
]
}
第二个:
doc2 = {
foo: 'b',
boo: 9,
rplans: [
{
prop1: 'ooo',
prop2: false,
prop3: 90
},
{
prop1: 'mmm',
prop2: false,
prop3: 120.80
},
{
prop1: 'nnn',
prop2: true,
prop3: 80
},
]
}
和第三个遵循相同模式的
以下方法(使用AngularFire)返回一个可观察到的RatePlan数组
public getAllRatePlansForCompany(companyId: string): Observable<RatePlan[]> {
return this._fsSrvc.colWithIds$<RatePlan[]>('Company/' + companyId + '/Room_Types/')
.pipe(
map((res, idx) => res = res[idx].Rate_plans)
);
}
该方法的调用方式如下:
this.ratePlansArr$ = this.inventoryService.getAllRatePlansForCompany(this.company.id);
this.ratePlansArr$.subscribe();
但是,在执行时,它仅返回第一个文档(doc1)的rplan。
应如何修改以返回包含所有3个文档的rplan的Array?
谢谢
答案 0 :(得分:1)
尝试flatMap
flatMap((doc) => doc.rplans)
。理想情况下,可以从阵列中制造出一维阵列。
答案 1 :(得分:0)
据我所知,您在这里只需要输入一次数据:
this.ratePlansArr$ = this.inventoryService.getAllRatePlansForCompany(this.company.id);
要获得3个结果,您应该将其命名为三次:
const conpanyIds = [1,2,3];
const arrayOfObservables = conpanyIds.map(id => this.inventoryService.getAllRatePlansForCompany(id))
this.ratePlansArr$ = forkJoin(arrayOfObservables).pipe(
(arrayOfresults) => arrayOfresults.rplans
)
this.ratePlansArr$.subscribe(console.log)