我知道angularfire2的整个目的是通过可观察的应用程序和firebase的流畅的来回同步。我在我的应用程序中使用该功能,但在一个地方,特别需要将数据作为不会发生变化的固定副本。
假设数据库看起来像这样
// firebase is something like:
// { items: {
// item1: { ... },
// item2: { ... },
// item3: { ... }
// }
// }
myList$: FirebaseListObservable<any[]>;
myList: any[];
this.myList$ = this.af.database.list('/items');
this.myList$.subscribe(questions => {
this.myList = questions; // can this.myList ever be frozen?
});
换句话说,在上面的示例中,是否有任何可能的方法可以轻松获取items
,因为它就在那个确切的时刻,而不是,例如,更新/ item4
出现的时间?
答案 0 :(得分:0)
不确定。如果您使用first
运算符进行组合,则observable将在发出第一个值时完成,因此您不会收到任何进一步更改的通知:
import 'rxjs/add/operator/first';
myList$: Observable<any[]>;
myList: any[];
this.myList$ = this.af.database.list('/items').first();
this.myList$.subscribe(questions => { this.myList = questions; });
而且,完成后,无需取消订阅。
关于评论中的问题,没有理由第一次调用会起作用,后续调用将返回一个空数组。唯一的解释是后续位置不包含数据。
此外,使用您的函数,返回一个promise更有意义 - 而不是订阅和操作一个对象属性(没有指示何时修改所述属性的机制):
import 'rxjs/add/operator/first';
import 'rxjs/add/operator/toPromise';
myFunc(location: string): Promise<any[]> {
return this.af.database
.list('/items/' + location)
.first()
.toPromise();
}