Angularfire:从控制器中的$ firebaseObject获取嵌套数据

时间:2017-09-26 14:59:00

标签: javascript firebase firebase-realtime-database angularfire

Firebase新手在这里。

在我的控制器中,我有一个名为currentChallenge的变量,它包含以下$ firebaseObject:

$$conf: {sync: {…}, ref: X, binding: f, listeners: Array(0)}
$id: "gRH2EWGQB6dbejKYap40Z0ea0nz2"
$priority: null
-Kuy9HAfvVIhPhtQraLy:
  challenge: {...}
  challenger: "gRH2EWGQB6dbejKYap40Z0ea0nz2"
  pending: true
  timestamp: 1506428920780
  __proto__: Object
__proto__: Object

在Firebase中,它看起来像: enter image description here

我的控制器的代码如下:

Challenge.lastChallenge(uid, challengeUserId).$loaded()
  .then(function (currentChallenge) {
    if (currentChallenge.challenger == uid) {
      // stuff happens
    }

这是调用挑战服务方法:

lastChallenge: function (uid1, uid2) {
   var path = uid1 < uid2 ? uid1 + '/' + uid2 : uid2 + '/' + uid1;
   return $firebaseObject(userChallengeRef
     .child(path)
     .orderByChild('timestamp')
     .limitToLast(1));
},

我尝试访问的数据是challenger,但我不确定如何执行此操作,因为$value似乎无法处理对象。

我不能放-Kuy9HAfvVIhPhtQraLy,因为根据我正在看的挑战,这可能会有所改变。它也不总是与$id相同的值。

1 个答案:

答案 0 :(得分:2)

您正在对Firebase执行查询:

userChallengeRef
  .child(path)
  .orderByChild('timestamp')
  .limitToLast(1))

对Firebase数据库执行查询时,可能会有多个结果。因此快照包含这些结果的列表。即使只有一个结果,快照也会包含一个结果的列表。

这意味着您需要使用$firebaseArray来获取结果并对其进行迭代。使用常规JavaScript SDK时,它会是这样的:

lastChallenge: function (uid1, uid2) {
   var path = uid1 < uid2 ? uid1 + '/' + uid2 : uid2 + '/' + uid1;
   return new Promise(function(resolve, reject) {
     userChallengeRef
       .child(path)
       .orderByChild('timestamp')
       .limitToLast(1))
       .once("value").then(function(snapshot) {
         snapshot.forEach(function(child) {
           resolve($firebaseObject(child.ref));
         });
       });
}

将其调用为:

Challenge.lastChallenge(uid, challengeUserId).then(function(firebaseObject){ 
  firebaseObject.$loaded().then(function (currentChallenge) {
    if (currentChallenge.challenger == uid) {
      // stuff happens
    }

请注意,我不认为使用AngularFire可以帮助您。您应该只将AngularFire服务用于直接绑定到Angular UI的内容。对于所有其他操作,只需直接使用Firebase JavaScript SDK即可。它使您的代码更简单,并且更容易推断您的应用程序的逻辑与其UI。