1

Ich versuche, Benutzerinformationen aus der Datenbank des Benutzers abzurufen und mit rootscope von überall her darauf zuzugreifen.
Ich erhalte die E-Mail und die Benutzer-ID des Benutzers, wenn der Benutzer sich anmeldet. Um die Benutzerinformationen aus der Datenbank zu erhalten, muss ich jedoch meine Datenbank aufrufen und die Informationen einzeln in rootscope speichern, um darauf zugreifen zu können überall.
angularjs rootscope Benutzerdatenbank info von Firebase

So ist meine Frage unter:

  • Wie kann ich rootscope in diesem Beispiel verwenden?
  • Gibt es einen besseren Weg, dies zu tun?
  • Im folgenden Beispiel zeigt das Konsolenprotokoll den Vornamen, aber ich weiß nicht, wie man es rootscope?

Danke für Hilfe.

app.run(['$rootScope', '$state', '$stateParams', '$cookies', "$location", 
function ($rootScope, $state, $stateParams, $cookies, $location) { 

    firebase.auth().onAuthStateChanged(function(user) { 
     if (user) { 

      $rootScope.user.uid = user.uid; 
      $rootScope.user.email = user.email; 

      return firebase.database().ref('/users/' + user.uid).once('value').then(function(snapshot) { 

       var firstname = snapshot.val().firstname; 
       console.log("first name", firstname); 

      }); 
     } else { 
      // No user is signed in. 
     } 
    }); 
}]); 

Antwort

1

Wenn Sie AngularFire verwenden immer seine Wrapper-Methoden vs nativen Feuerbasis Methoden.

Sie

nicht
firebase.auth().onAuthStateChanged 
firebase.database().ref('/users/' + user.uid).once('value') 

Verwenden

$firebaseAuth().$onAuthStateChanged 
var userData = $firebaseObject(firebase.database().ref('/users/' + user.uid)); 

Kasse den folgenden Link für eine vollständige Liste der verfügbaren Methoden in angularFire verwenden. https://github.com/firebase/angularfire/blob/master/docs/reference.md

Ich empfehle, Ihren Code so zu ändern.

$firebaseAuth().$onAuthStateChanged(function(user) { 
    if (user) { 
     $rootScope.user = $firebaseObject(firebase.database().ref('/users/' + user.uid)); 
     $rootScope.user.uid = user.uid; 
     $rootScope.user.email = user.email; 
     console.log("Here you should have complete user object"); 
     // still if you want to do something when user is loaded 
     /* $rootScope.user.$loaded(function(loadedUser) { 
      var firstname = loadedUser.firstname; 
      console.log("first name", firstname); 
     });*/ 
    } else { 
     // No user is signed in. 
    } 
}); 

Natürlich müssen Sie $firebaseObject und $firebaseAuth mit Dependency Injection aufzunehmen.

1

Es gibt zwei Ansätze Ihre Bedürfnisse

Ansatz zu erfüllen 1:

Sie können dies $rootScope.authData=user; tun es dann von überall zugreifen $rootScope injiziert wird. aber Problem dabei ist, dass, wenn Sie Seite neu geladen $rootScope leer sein Überprüfen Sie diese SO Question

Ansatz 2:

Ich werde diesen Ansatz bevorzugen, können Sie verwenden $getAuth() Funktion von angularfire verwenden, $getAuth ist syncronous Funktion Das gibt Ihnen aktuelle Benutzerdaten.

var myUser=$scope.AuthObj.$getAuth(); 

für more detail check this

+0

Könnten Sie bitte eine vollständige Antwort schreiben und wie Sie sie an meinen Code anpassen? Ich bin ein bisschen verwirrt. – cplus

+0

welche Version von Firebase Sie verwenden –

+0

haben es geschafft, können Sie 'var myUser = $ firebaseAuth(). $ GetAuth();' in jedem Controller, um in Benutzerinformationen angemeldet zu bekommen. –

Verwandte Themen