【问题标题】:retrieve static data from firebase with angularfire2使用 angularfire2 从 firebase 检索静态数据
【发布时间】:2017-05-22 16:28:54
【问题描述】:

我知道 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?
});

换句话说,在上面的示例中,是否有任何可能的方法可以轻松获取items,因为它在那个确切的时刻,而不是,例如,当/如果item4 出现时更新?

【问题讨论】:

  • 您可以将其存储为字符串,当您需要使用它时,再次将其解析为 JSON。这对你有用吗?

标签: angular typescript angularfire2


【解决方案1】:

当然。如果你使用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; });

而且,完成后,无需取消订阅。

关于您评论中的问题,没有理由第一次调用会起作用,随后的调用会返回一个空数组。唯一的解释是后续位置不包含数据。

此外,使用您的函数,返回一个承诺会更有意义 - 而不是订阅和操作对象属性(没有指示何时修改所述属性的机制):

import 'rxjs/add/operator/first';
import 'rxjs/add/operator/toPromise';

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

【讨论】:

  • 我喜欢这个解决方案。当我把它放在一个函数中并改变周围的位置时,我确实遇到了一个问题。 pastebin.com/reu78FgJ 第一个调用正确,但之后的每个调用都有一个空的 [] 表示“问题 =>”。知道为什么/围绕那个吗?
  • 更新了答案。
猜你喜欢
  • 2017-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多