让我们像这样定义商业模式
export inteface Item {
id: string;
name: string;
}
export interface Container {
id: string;
items: Item[];
}
在Cloud Firestore中,我们有集合/containers
每个容器都包含带有文档的集合/items
。
每个文档都有字段name
。
因此,Cloud Firestore内部的结构会复制我们的商业模式。
现在我想要检索具有其项目集合的特定容器。
getContainer(idIn: string) {
const document: AngularFirestoreDocument<Container> = this.afs.doc('containers/' + idIn);
const document$: Observable<Container> = document.snapshotChanges().map(a => {
const data = a.payload.data() as Container;
const id = a.payload.id;
return this.getItems(idIn).map( item => {
return {id, ...data, items: item};
});
});
return document$;
}
getItems(id: string) {
const collection: AngularFirestoreCollection<Item> = this.afs.collection('containers/' + id + '/items');
return collection.snapshotChanges().map(actions => {
return actions.map(a => {
const data = a.payload.doc.data() as Item;
const id = a.payload.doc.id;
return {id, ...data};
});
});
}
但是我一直收到关于返回Observable时缺少id的错误。 使用typescript 2.6.2进行编译。
error TS2322: Type 'Observable<Observable<{ items: { 'id': string; 'item': string; }[]; 'id': string...' is not assignable to type 'Observable<Container>'.
Type 'Observable<{ items: { 'id': string; 'item': string; }[]; 'id': string...' is not assignable to type 'Container'.
Property ''id'' is missing in type 'Observable<{ items: { 'id': string; 'item': string; }[]; 'id': string...'.
有谁可以指出我做错了什么?
答案 0 :(得分:1)
在我看来,您的返回数据与接口模态不同。您只在界面中指定了id
和items
字段,因此它将是
const data = a.payload.data() as Container;
const id = a.payload.id;
let items=[];
this.getItems(idIn).valueChanges().subscribe(res=>{
res.forEach(item=>{
items.push(item);
})
});
return {id:id, items: items};
答案 1 :(得分:0)
我正在阅读Firestore中的嵌套集合,以在我的情况下填充Expansion小部件。在https://stackoverflow.com/a/51057195/5013735
中查看我的解决方案诀窍在于创建一个像这样的结构:
List<Widget> _getChildren() {
List<Widget> children = [];
documents.forEach((doc) {
children.add(
ProjectsExpansionTile(
name: doc['name'],
projectKey: doc.documentID,
firestore: firestore,
),
);
});
return children;
}