在.valueChanges()中使用的持久文档ID提供了两个不同的ID

时间:2017-10-05 08:02:32

标签: firebase angularfire2 google-cloud-firestore

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()

     

...

     

你什么时候不用? - 当您需要比数组更复杂的数据结构时,或者您需要在发生更改时处理更改。

2 个答案:

答案 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);
}

https://github.com/angular/angularfire2/pull/1539/files