在我的网站中,我想按名称显示项目列表。这些名称是可点击的,然后应下载整个文档,您可以编辑和保存该项目。
目前,我正在使用文档中描述的方式从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中一次查询一个集合,最好是查询参数,然后显示它?
答案 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()));
}