AngularFire2检索不订阅更改(Firestore)

时间:2018-01-16 13:06:34

标签: angular angularfire2

在我的网站中,我想按名称显示项目列表。这些名称是可点击的,然后应下载整个文档,您可以编辑和保存该项目。

目前,我正在使用文档中描述的方式从FireStore查询收集数据:https://github.com/angular/angularfire2/blob/master/docs/firestore/collections.md

class_scores = tf.reduce_max(probs, axis=1)

问题是,我想要或需要我的列表的实时更新。因此,Observable方法对我的应用程序没有任何意义。

我提出的唯一方法是我只使用snapshotChanges方法,并将其映射到一个数组,然后我将其分配给一个字段。之后映射功能将items和itemsCollection字段设置为null,因此它们不会浪费更多带宽。但这对我来说似乎并不合适。

有没有办法在AngularFire中一次查询一个集合,最好是查询参数,然后显示它?

3 个答案:

答案 0 :(得分:4)

我处理此问题的一种方法是使用rxjs/add/operator/first。此方法获取Observable数据,然后结束订阅。

只需导入上面的图书馆并按照这样的方式拨打电话:

this.items = this.itemsCollection.valueChanges().first();

然后你可以订阅它,它只会获取一次数据:

this.items.subscribe((items) => { // do something with items array // });

我知道还有其他方法可以使用rxjs do()take()方法来处理这个问题,因为您可能需要查看这些方法。我希望这可以有所帮助!

答案 1 :(得分:3)

正如Nicholas Pesa已经回答的那样,使用.first()运算符可以工作,唯一需要注意的是它在发出值后没有取消订阅。如果使用.take(整数)运算符作为.take(1),则observable将在发出第一个值后完成。 那是不对的。 以下关于可观测量的注释是有效的。

通过这种方式,你实际上让事情变得更加艰难,几乎没有任何好处。即使您没有真正使用可观察流方法,可观察的方法也会使事情变得更容易。只需让异步管道(|)为您处理您的订阅,这样您就不必担心订阅或取消订阅。如果您的数据没有变化,那么模板将仅在第一次在firestore中调用该集合。

答案 2 :(得分:0)

如果需要,请使用适用于Web的标准Firebase SDK,它提供基于promiss的API(请查看文档here),以便您可以在服务中创建Promise类型的getter(Or Observable.fromPromise( )只会发一次):

import * as firebase from 'firebase';

const itemsRef = firebase.firestore().collection('items');

// Into your service:
getItems(): Promise<Item[]> {
  const items: Item[];
  return itemsRef.get()
  .then(colSnap => colSnap.docs().map(snapshot => snapshot.data()));
}