0

Je suis très nouveau à Ionic/Firebase mais j'ai essayé de nettoyer mon code de sorte que tout ce qui concerne l'accès à la base de données est dans mon usine. La façon dont j'ai structuré mes utilisateurs est que l'uid de toute nouvelle authentification, y compris Facebook ou Google, est stocké dans un tableau d'uids, avec la clé associée. L'utilisateur est également stocké dans le tableau des utilisateurs en premier (où la clé ci-dessus a été générée de manière aléatoire). Cela me permet d'accéder à l'utilisateur actuel à partir de l'objet Auth.Créer une usine pour obtenir l'objet utilisateur actuel à tout moment de Ionic/Firebase

{ 
    "uids" : { 
    "7d34fb85-813c-4586-857e-f062aed67f32" : { 
     "-KDQDk5vwJXmFngwI7iQ" : { 
     "registered" : true 
     } 
    } 
    }, 
    "users" : { 
    "-KDQDk5vwJXmFngwI7iQ" : { 
     "email" : "[email protected]", 
     "firstname" : "TestName", 
     "lastname" : "TestLastName", 
     "uid" : "7d34fb85-813c-4586-857e-f062aed67f32" 
    } 
    } 
} 

Maintenant, je suis en train de créer une usine, je peux appeler à partir d'un contrôleur pour obtenir les détails de l'utilisateur actuel - prénom, nom, etc.

Cependant, je ne pense pas que ce soit la bonne façon de faire fonctionner les choses. Idéalement, je veux être en mesure d'appeler Users.getCurrentUser.firstname sur n'importe quel contrôleur.

Voici les deux usines. Qu'est-ce que je fais de mal et comment puis-je restructurer mon code?

/** 
* Authentication service 
*/ 
    app.factory('Auth', ['rootRef', '$firebaseAuth', function (rootRef, $firebaseAuth) { 
     return $firebaseAuth(rootRef); 
    }]); 

/** 
* Anything related to the Users array 
*/ 
app.factory('Users', ['$firebaseArray','$firebaseObject', 'Auth', function ($firebaseArray, $firebaseObject, Auth) { 

    var ref = new Firebase("https://[myfirebaseurl].firebaseio.com"); 
    var users = $firebaseArray(ref.child('users')); 
    var uids = $firebaseArray(ref.child('uids')); 

    return { 
     all: function() { 
      return users; 
     }, 
     get: function (id) { 
      // Simple index lookup - I also want to be able to use this if a user lets say clicks a user profile in a list of profiles in the app to view a profile, but currently I have no user_id key in my database - do I need to set this up? 
      return users[id]; 
     }, 
     getCurrentUser: function() { 
      var uid = Auth.$getAuth().uid; 
      var key = new Firebase(uids + uid).child(); 
      var user = new Firebase(users + key).child(); 
      return $firebaseObject(user); 
     } 
    } 

}]) 

Toute aide plus appréciée.

Merci.

+0

Vous avez inclus une photo de la Arbre JSON dans votre question. Remplacez-le par du texte JSON, que vous pouvez facilement obtenir en cliquant sur le bouton Exporter de votre base de données Firebase. Avoir le JSON sous forme de texte le rend facilement consultable, nous permet de l'utiliser facilement pour tester avec vos données réelles et l'utiliser dans notre réponse et en général, c'est juste une bonne chose à faire. –

+0

@FrankvanPuffelen voir les changements. –

Répondre

1

Cela ne marchera jamais:

Users.getCurrentUser().firstname 

Comme la plupart des web moderne, chargement des données dans Firebase se produit de manière asynchrone. Pendant le chargement des données (et dans le cas de Firebase, par la suite, elles seront synchronisées), le code JavaScript continue à s'exécuter. C'est pourquoi vous devez fractionner le "démarrage du chargement" à partir de l'opération "lorsque les données utilisateur ont été chargées/changées".

En AngularFire, vous pouvez obtenir les données initiales qui est chargé pour l'utilisateur, en attendant la $loaded() promesse de résoudre:

var user = $firebaseObject(user); 
user.$loaded(function(user) { 
    console.log(user.firstname); 
}); 

Mais ce qui est vraiment un anti-modèle, étant donné que les données de l'utilisateur peut changez ensuite et cela ne sera plus votre rappel $loaded().

La meilleure façon de voir ce qui se passe avec AngularFire est de visualiser simplement les objets dans votre AngularJS Vue:

$scope.user = $firebaseObject(user); 

Et puis:

<pre> user | json </pre> 
+0

OK compris re: résolution. Mais pouvez-vous préciser où vont toutes ces parties du code? D'où vient la variable utilisateur qui est l'argument de '$ firebaseObject'? Et ce code '$ loaded' va dans chaque contrôleur pour obtenir l'utilisateur actuel? Est-il impossible que je puisse réutiliser quelque chose pour obtenir cet utilisateur actuel, par exemple. un service/usine? En outre, pourriez-vous préciser si mon code pour trianguler l'utilisateur de l'uid et de la clé est correct? –