使用angularfire2从firebase检索静态数据

使用angularfire2从firebase检索静态数据,angular,typescript,angularfire2,Angular,Typescript,Angularfire2,我知道angularfire2的全部目的是通过observable实现应用程序和firebase的流体来回同步。我在我的应用程序中都使用这个功能,但有一点是,我特别需要将数据作为一个不变的固定副本来获取 假设数据库是这样的 // firebase is something like: // { items: { // item1: { ... }, // item2: { ... }, // item3: { ... } // } // } myList$

我知道angularfire2的全部目的是通过observable实现应用程序和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?
});
//firebase类似于:
//{项目:{
//第1项:{…},
//第2项:{…},
//第3项:{…}
//    }
// }
myList$:FirebaseListObservable;
myList:任何[];
this.myList$=this.af.database.list('/items');
此.myList$.subscribe(问题=>{
this.myList=questions;//this.myList会被冻结吗?
});

换句话说,在上面的示例中,是否有任何可能的方法可以轻松地获取
项目
,因为它正处于该时刻,而不是在出现
项目4
时进行更新?

当然。如果使用
first
操作符组合,则可观测值将在发出第一个值时完成,因此不会通知您任何进一步的更改:

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; });
导入'rxjs/add/operator/first';
myList$:可观察的;
myList:任何[];
this.myList$=this.af.database.list('/items').first();
this.myList$.subscribe(questions=>{this.myList=questions;});
而且,当它完成时,没有必要取消订阅

关于您评论中的问题,没有理由第一次调用可以工作,而后续调用将返回空数组。唯一的解释是后续位置不包含任何数据

此外,对于函数,返回承诺比订阅和操作对象属性更有意义(没有机制指示所述属性何时被修改):

导入'rxjs/add/operator/first';
导入“rxjs/add/operator/toPromise”;
myFunc(位置:字符串):承诺{
返回此.af.database
.list('/items/'+位置)
.first()
.toPromise();
}

您可以将其存储为字符串,并在需要时再次将其解析为JSON。这对你有用吗?我喜欢这个解决方案。当我把它放在函数中并改变周围的位置时,我确实遇到了一个问题。它第一次调用正确,但之后的每次调用都有一个空[]表示'questions=>'。知道原因吗?更新了答案。
import 'rxjs/add/operator/first';
import 'rxjs/add/operator/toPromise';

myFunc(location: string): Promise<any[]> {
    return this.af.database
        .list('/items/' + location)
        .first()
        .toPromise();
}