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

Angularfire: Getting nested data from a $firebaseObject in controller

这里是 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 中它看起来像:

我的控制器的代码如下:

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.

相同的值

您正在对 Firebase 执行查询:

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

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

这意味着您需要使用 $firebaseArray 来获取结果并迭代 it/them。当使用常规 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 对您有任何帮助。您应该只对直接绑定到 Angular UI 的东西使用 AngularFire 服务。对于所有其他操作,只需直接使用 Firebase JavaScript SDK。它使您的代码更简单,并且更容易推理您的应用程序的逻辑与其 UI.