在angularfire2 docs中,它解释了为了保留文档ID以供.valueChanges()
使用,您应该使用afs.createId()
创建一个。
export class AppComponent {
private itemsCollection: AngularFirestoreCollection<Item>;
items: Observable<Item[]>;
constructor(private readonly afs: AngularFirestore) {
this.itemsCollection = afs.collection<Item>('items');
// .valueChanges() is simple. It just returns the
// JSON data without metadata. If you need the
// doc.id() in the value you must persist it your self
// or use .snapshotChanges() instead. See the addItem()
// method below for how to persist the id with
// valueChanges()
this.items = this.itemsCollection.valueChanges();
}
addItem(name: string) {
// Persist a document id
const id = this.afs.createId();
const item: Item = { id, name };
this.itemsCollection.add(item);
}
}
然而,当添加到集合中时,项目的ID和它所存储的密钥不同。它是否正确?有没有办法在添加到集合时设置密钥以使它们匹配?我觉得有两个id可能会让你头疼。
我知道.snapshotChanges()
提供了元数据,但是我在项目中流式传输项目,并且映射快照更改会导致每个条目以角度重新呈现。我认为这是文档在说出以下内容时所警告的内容:
snapshotChanges()
...
你什么时候不用? - 当您需要比数组更复杂的数据结构时,或者您需要在发生更改时处理更改。
答案 0 :(得分:0)
我不确定为什么文件说明了这一点,如果有人能给出解释,我将不胜感激。
我解决了在创建文档时显式设置id的问题,如下所示:
public addSubBudget = (bdgtId, description: string) => {
const coord = BUDGET_COLLECTION + '/' + bdgtId + '/sub-budgets';
const subBudgetCollRef = this.afs.collection<SubBudget>(coord);
const id = this.afs.createId();
const subBudget: SubBudget = { id, description };
return subBudgetCollRef.doc(id).set(subBudget);
}
答案 1 :(得分:0)
对于将来的参考,文档有一个错误。这就是ID应该如何持久化:
addItem(name: string) {
// Persist a document id
const id = this.afs.createId();
const item: Item = { id, name };
this.itemsCollection.doc(id).set(item);
}