如何加入Firebase数据库中多个位置的数据?

时间:2015-11-07 17:20:42

标签: firebase

我有一个与用户X关联的通知ID索引。当我想显示这些通知时,我需要从用户X的通知索引中获取它们,该索引只包含

a)通知的ID(nid)

b)状态:“已读/未读”

但我还需要去

a)/ notifcations / nid获取我的通知数据:text和fromUser

b)/ users / fromUser获取该用户的用户数据

我的问题是关于结构。

我是否正确构建了数据?如果是,我如何在通知中获取所有这些信息,并在准备好后将其呈现为角度以便在屏幕上显示。

以下是我对此的看法。任何批评(代码/结构/任何东西)都是受欢迎的。感谢。

P.S。 此外,如果我使用通知实例替换firebaseArray中的POJO,当我说编辑通知并将其保存回Firebase时,这将如何影响我的数据库。 AngularFire如何知道要保存什么?

/* Notifications */

.factory('Notifications', function(firebaseUrl, NotificationsFactory){
  var ref = new Firebase(firebaseUrl);

  return {
    getNotificationsForUser : function(uid){
      var userNotifRef = ref.child('users').child(uid).child('notifications');
      return new NotificationsFactory(userNotifRef);
    }
  }
})

.factory('NotificationsFactory', function($firebaseArray, Notification) {
  return $firebaseArray.extend({
    $$added : function(snapshot, prevChild){ //called anytime a 'child_added' event occurs
      return new Notification(snapshot);
    }
  })
})

.factory('Notification', function(firebaseUrl, $q, Users) {
  var notifRef = (new Firebase(firebaseUrl)).child('notifications');
  var usersRef = (new Firebase(firebaseUrl)).child('users');

  var mainDeferred = $q.defer();
  var notifDeferred = $q.defer();
  var userDeferred = $q.defer();

  var Notification = function(snapshot){
    this.$id = snapshot.key();
    this.status = snapshot.val().status;
    this.message = null;
    this.from = null;
    this.to = null;

    notifRef.child(this.$id).once('value', function(snap){ //change to on if expect notification to keep updating
      var data = snap.val();
      this.message = data.message;
      this.from = data.from; //user id
      this.to = data.to; //user id
      notifDeferred.resolve();
    });

    notifDeferred.promise.then(function(){
      this.from = Users.getUser(this.from);
      this.to = Users.getUser(this.to);
      this.from.$loaded().then(function(){
        this.to.$loaded().then(function(){
          mainDeferred.resolve();
        })
      })
    })
  };

  Notification.prototype.ready = function(){
    return mainDeferred.promise;
  }

  return Notification;
})

0 个答案:

没有答案