将数据映射到对象并将其作为promise / observable返回,同时又可以向查询中添加动态/条件参数的推荐方法。
在getcompanies2中,我可以向查询中动态添加参数,但是我无法弄清楚如何映射返回到我的对象的数据并将其作为Promise / Observable返回。
在getcompanies中,一切都可以按我的要求工作,但是如果要添加动态查询参数,则必须重复代码(如下所示)。
注意:convertDocTimeStampsToDate只是按照它说的去做。我已经排除了它,以减少代码部分的大小。
getcompanies(searchText: string,useWhereactive: boolean): Observable<Company[]> {
if (useWhereactive) {
return this.db.collection('companies',ref => ref
.orderBy('name').startAt(searchText).endAt(searchText + '\uf8ff')
.where('active','==',true)
)
.snapshotChanges()
.pipe(
map(snaps => convertsnaps<Company>(snaps)),first()
);
} else {
return this.db.collection('companies',ref => ref
.orderBy('name').startAt(searchText).endAt(searchText + '\uf8ff')
)
.snapshotChanges()
.pipe(
map(snaps => convertsnaps<Company>(snaps)),first()
);
}
}
getcompanies2(searchText: string,useWhereactive: boolean) {
let query = this.db.collection('companies').ref
.orderBy('name').startAt(searchText).endAt(searchText + '\uf8ff');
if (useWhereactive) {
query.where('active',true);
}
query.get().then(querysnapshot => {
const results = this.convertDocuments<Company>(querysnapshot.docs);
console.log(results);
});
}
convertDocuments<T>(docs) {
return <T[]>docs.map(doc => {
return {
id: doc.id,...doc.data()
};
});
}
export function convertsnaps<T>(snaps) {
return <T[]>snaps.map(snap => {
const data = convertDocTimeStampsToDate(snap.payload.doc.data());
return {
id: snap.payload.doc.id,...data
};
});
}