使用angularfire2从firebase检索静态数据

时间:2017-01-08 07:47:15

标签: angular typescript angularfire2

我知道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出现的时间?

1 个答案:

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