0

angularfire2 文档中,它解释说,为了保持文档 ID 以供使用.valueChanges(),您应该创建一个 with 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()提供了元数据,但是我正在流式传输项目中的项目,并且映射快照更改会导致每个条目以角度重新呈现。我认为这是文档在他们说以下内容时警告的内容:

快照更改()

...

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

4

2 回答 2

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

于 2018-03-31T16:07:51.650 回答
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);
 }
于 2017-11-28T18:20:51.863 回答