【问题标题】:AngularFire2 Retrieving Data SnapshotAngularFire2 检索数据快照
【发布时间】:2017-06-27 17:10:25
【问题描述】:

现在,我正在使用described in the documentation 方法解包我的数据。但是,文档指出:

AngularFire2 默认解包 Firebase DataSnapshot,但您可以通过指定 preserveSnapshot 选项将数据作为原始快照获取。

如何在不手动解包数据快照的情况下访问“默认”解包功能(阅读:访问item 的元素)?

我的 Firebase 数据如下所示:

{
  testObj : {
    firstName: "beckah",
    lastName: "s"
  }
}

我的代码(有效)是:

import { Component } from '@angular/core';
import { NavController } from 'ionic-angular';
import { AngularFireDatabase, FirebaseObjectObservable } from 'angularfire2/database';

@Component({
  selector: 'page-home',
  templateUrl: 'home.html'
})
export class HomePage {
  item: FirebaseObjectObservable<any>;
  constructor( public navCtrl: NavController,
              public db: AngularFireDatabase ) {
    this.item = db.object('/testObj', { preserveSnapshot: true });
    this.item.subscribe(snapshot => {
      console.log(snapshot.val())
    });
  }
}

哪些输出

Object {firstName: "beckah", lastName: "s"}

我如何能够做完全相同的事情(console.log 我的item 对象)而不像文档状态那样手动解开我的快照是可能的?

是否有某种this.item.get("firstName") 方法?

【问题讨论】:

    标签: angular firebase ionic2 angularfire2


    【解决方案1】:

    使用 AngularFire,您根本无需担心快照。只需订阅 AngularObjectObservable,它就会为您提供对象。

    angularfire2 版本 4

    this.item$ = this.db.object('/item').subscribe(item => console.log(item));
    

    angularfire2 版本 5

    this.item$ = this.db.object<Item>('/item').valueChanges().subscribe(item => console.log(item));
    

    您不应该在构造函数中订阅。订阅onNgInit。然后确保在onNgDestroy 中取消订阅以避免内存泄漏。

    在许多情况下,您根本不需要订阅——让 Angular 在模板中使用async 管道来完成:

    angularfire2 版本 4

    // component
    public item$: FirebaseObjectObservable<Item>;
    
    ngOnInit() {
      this.item$ = this.db.object('/item');
    }
    
    // template
    <div *ngIf="item$ | async as item">
      First name is {{item?.firstName}}.
    </div>
    

    angularfire2 版本 5

    // component
    public item$: Observable<Item>;
    
    ngOnInit() {
      this.item$ = this.db.object<Item>('/item').valueChanges();
    }
    
    // template
    <div *ngIf="item$ | async as item">
      First name is {{ item?.firstName }}
    </div>
    

    【讨论】:

    • 当你提到AngularObjectObservable时,你的意思是rxjs/Observable吗?
    • 对不起,我的意思是FirebaseObjectObservable,它是Observable的子类。
    • 没问题 :) 不过在这种情况下,我认为您不能同时订阅结果并执行作业。您将收到错误 Type 'Subscription' is not assignable to type 'FirebaseObjectObservable&lt;any&gt;'。但是您可以在 console.logs 的第二个参数中弹出一个匿名函数并进行分配。无论如何,这对如何使用模板异步收听很有帮助。
    • 另外,我无法编辑您的答案,但对于其他认为此答案有帮助的人,可能值得添加 {{ testObj$?.firstName }} 以显示如何显示特定字段
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多