【问题标题】:How do I fetch Firebase Object and set equal to local object?如何获取 Firebase 对象并设置为等于本地对象?
【发布时间】:2018-02-10 00:48:20
【问题描述】:

我正在使用 Angular 构建一个 Ionic 应用程序,该应用程序使用 Firebase 作为身份验证/数据库。

在我的应用上,用户可以创建不同的事物或对象。然后我将这些对象放入一个数组中。所以我最终得到了一个对象数组。用户可以删除该本地列表中的内容、更改内容或添加新内容。

我想要的是能够在 Firebase 中获取(我成功存储的)对象,并将其设置回对象。我是 Firebase 的新手,它是 api,所以我有点卡住了。这是我从 Firebase 检索对象的代码:

fetchList() {
    const user = this.authService.getActiveUser();
    if (user != null) {
        return firebase.database().ref(user.uid + '/lists').once('value')
            .then( snapshot => {
                return snapshot.val();
            })
            .catch( err => {
                return err;
            });
    }

}

我已经阅读了所有 Firebase 文档,但我无法弄清楚 snapshot.val() 返回的内容。它是返回一个对象还是什么。如果是这样,我是否必须解析对象以重建我的本地对象数组?

这是 Firebase 中某些数据的示例结构。 0 是数组索引。我基本上只是传入我的对象数组,Firebase 就这样存储它。现在我想检索它并将其设置为等于我的本地对象数组,这样用户就可以拥有

+ Sidfnh450dfFHdh989490hdfh
- DFjghd904hgGHdhfs9845hfh0
  - lists
    - 0 
        hasProperty1: false
        isProperty2: false
        otherProperty: 'string stuff here'
        title: 'List Title'
    + 1
    + 2

或者,也许我做错了。也许存在一种类似于双向数据绑定的神奇 Firebase 方法,无论我在本地对象数组上所做的任何更改都会反映 Firebase,反之亦然。任何建议表示赞赏。

编辑

此外,我在本地做的事情是对数组进行重新排序。我的应用程序是某种列表,用户可以重新排序列表中的对象。因此,如果我确实有一个与 Firebase 同步的列表,并且有人重新排序了列表中的一些对象,我不确定如何在 Firebase 中重新排序它们而不删除整个对象数组并编写一个新的一个具有更新的数组索引。

【问题讨论】:

  • 肯尼你使用的是 Angular 2/4 还是 AngularJS?如果 Angular2/4 则查看 angularfire2 NPM 包。它使集成到 Firebase 变得更加容易。
  • 您获得了 3 路数据绑定,因此您无需在本地存储数组 - 这一切都与 firebase 数据库同步。 github.com/angular/angularfire2
  • 好吧,我在本地做的一些事情我认为我不能用 angularfire2 或 firebase 做,那就是重新排序一个数组。我可能会从中间取出一些东西,然后把它放下几个位置。

标签: angularjs firebase ionic-framework firebase-realtime-database


【解决方案1】:

如果您调整了在 Firebase 中存储数据的方式,您可以按预定义的顺序将其取出。

请注意您列表中的额外 order 键。

+ Sidfnh450dfFHdh989490hdfh
- DFjghd904hgGHdhfs9845hfh0
  - lists
    - key1
        hasProperty1: false
        isProperty2: false
        otherProperty: 'string stuff here'
        title: 'List Title'
        order: 1
    + keyn
        // ...
        order: 2
    + keyz
        // ...
        order: 3

在您的组件中,您可以通过对列表对象的查询来请求数据按顺序输出。

保存新订单时,您可以将key1key2等密钥和新订单传递给saveOrder函数。

import { AngularFireDatabase, FirebaseListObservable } from 'angularfire2/database';

@Component({
  selector: 'app',
  templateUrl: `
    <ul *ngFor="let item of list | async">
      <li>{{ item | json }}</li>
    </ul>
  `,
  styleUrls: ['./app.scss']
})
export class AppComponent implements OnInit {
  public list: FirebaseListObservable<any[]>;

  constructor(
    private db: AngularFireDatabase
  ) {}

  ngOnInit() {
    this.list = this.db.list('/DFjghd904hgGHdhfs9845hfh0/list', { query: { orderByChild: 'order' }});
  }

  saveOrder(key, newOrder) {
    return this.list.update(key, { order: newOrder });
  }
}

【讨论】:

  • 感谢您的回答。我一直在玩 AngularFire2,我想我要把所有东西都切换到它上面。最困难的挑战是重新排序列表(基本上是拖放)并将其反映在 Firebase 中。但你的回答是对的,我必须以不同的方式存储我的数据。 :)
  • 强烈推荐,也可以关注github.com/firebase/bolt,它会让管理数据库变得更容易。
猜你喜欢
  • 2019-10-12
  • 1970-01-01
  • 2019-08-07
  • 1970-01-01
  • 2012-12-18
  • 1970-01-01
  • 1970-01-01
  • 2018-08-11
  • 2010-12-08
相关资源
最近更新 更多