2017-09-26 5 views
0

Débutant Firebase ici.

Dans mon contrôleur, j'ai une variable appelée currentChallenge qui contient les firebaseObject $ suivants:

$$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 

En Firebase il ressemble: enter image description here

Le code de mon contrôleur se présente comme suit:

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

Appelez la méthode de service Challenge:

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

Les données que je suis en train d'accéder est challenger, mais je ne suis pas sûr comment faire cela comme $value ne semble pas fonctionner sur des objets.

Je ne peux pas mettre -Kuy9HAfvVIhPhtQraLy parce que cela peut changer selon le défi que je regarde. Il ne va pas toujours être la même valeur que $id.

Répondre

2

que vous exécutez une requête sur Firebase:

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

Lorsque vous exécutez une requête sur la base de données Firebase, il y aura potentiellement plusieurs résultats. L'instantané contient donc une liste de ces résultats. Même s'il n'y a qu'un seul résultat, l'instantané contiendra une liste d'un résultat.

Cela signifie que vous devrez utiliser $firebaseArray pour obtenir le (s) résultat (s) et le parcourir. Lorsque vous utilisez le SDK JavaScript régulier, ce sera quelque chose comme ceci:

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)); 
     }); 
     }); 
} 

invoquons comme:

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

Notez que je ne pense pas que l'utilisation AngularFire vous aide à tous ici. Vous ne devez utiliser les services AngularFire que pour les éléments que vous liez directement à votre interface utilisateur Angular. Pour toutes les autres opérations, utilisez directement le Firebase JavaScript SDK. Cela permet de simplifier le code et facilite le raisonnement concernant la logique de votre application par rapport à son interface utilisateur.

+0

Ok comment l'ajouter à la variable currentChallenge? Après avoir ajouté cela, je reçois une promesse plutôt que les données du défi. Merci et désolé si cette question semble stupide. – helpmeplz

+0

Ajout d'un échantillon. –