4

Derzeit verfüge ich über ein Berechtigungssystem, um den Status des An- und Abmeldens von Benutzern mithilfe von angularfire zu verfolgen. Die Anleitung, die ich anschaue, schlägt vor, $ onAuthStateChanged in jedem Controller zu verwenden.

Stattdessen habe ich eine Variable $ rootScope.session verwendet, um den aktuell angemeldeten Benutzer zu verfolgen. Das funktioniert größtenteils gut, aber ich kann nicht auf diese Sitzungsvariable beim Start anderer Controller zugreifen, da das Objekt an diesem Punkt nicht instanziiert wird. Gibt es eine saubere Möglichkeit, auf diese Sitzungsvariable im Bereich des Controllers zuzugreifen, so dass ich nicht in jeder Funktion einen neuen Verweis auf die Datenbank machen muss (da diese Funktionen aufgerufen werden, nachdem die Sitzungsvariable gesetzt wurde).

Um die Dinge ein wenig klarer zu machen.

ref = firebase.database().ref("users/" + $rootScope.session.id + '/meetings'); 
list = $firebaseArray(ref); 

An der Spitze meines Controllers funktioniert nicht, da $ rootScope.session.id noch nicht festgelegt ist.

Aber

$scope.addMeeting = function() { 
    ref = firebase.database().ref("users/" + $rootScope.session.id + '/meetings'); 
    list = $firebaseArray(ref); 
    list.$add({ 
     name: $scope.meetingname, 
     date: firebase.database.ServerValue.TIMESTAMP 
    }); 

};

Funktioniert als die Funktion, die auf einen Knopfklick aufgerufen wird, der immer sein wird, nachdem die Seite bereits geladen worden ist, folglich $ rootScope.session.id wird durch diesen Punkt festgelegt.

------------- aktualisieren -----------------

ich es bekommen habe mit dem firebases zu arbeiten vorgeschlagen Methodik, aber es sieht nicht schön aus. Es beinhaltet das Verschachteln aller Objekte in einem Listener auf dem Auth-Objekt der Firebase und dann die Verwendung einer if-Anweisung, um sicherzustellen, dass das Benutzerobjekt nicht null ist.

myApp.controller('MeetingsController', ['$scope', '$rootScope', '$firebaseAuth', '$firebaseArray', function($scope, $rootScope, $firebaseAuth, $firebaseArray){ 

    var authObj = $firebaseAuth(); 
    authObj.$onAuthStateChanged(function(firebaseUser) { 

    if (firebaseUser) { 
     var ref = firebase.database().ref("users/" + firebaseUser.uid + '/meetings'); 
     var meetings = $firebaseArray(ref); 

     $scope.addMeeting = function() { 
     meetings.$add({ 
      name: $scope.meetingname, 
      date: firebase.database.ServerValue.TIMESTAMP 
     }); 
     }; 

     $scope.deleteMeeting = function(key) { 
     meetings.$remove(meetings.$getRecord(key)).then(function(ref) { 
     }) 
     .catch(function(error){ 
      console.log(error); 
     }); 
     }; 
    } 
    }); //onAuthStateChange 

}]); 

Antwort

2

$rootScope ist eine schlechte Option für diese Art der Lagerung, da es jedes Mal, wenn Sie Ihre Seite aktualisieren gereinigt wird.

Sie sollten in ngStorage Lookign sein. Es kommt mit $localStorage und $sessionStorage, lesen Sie, was besser zu Ihren Bedürfnissen passt. Geben Sie ngStorage in Ihr Modul ein und injizieren Sie $localStorage in die Controller.

$localstorage.sessionId = id; 

Dies speichert die ID in Ihrem Browser.

+0

Danke, ich werde es versuchen! – user3225440

2

angularfire verfolgt die Sitzungen für Sie und behält die aktuellen Benutzerinformationen bei. Wenn Sie in der Auflösung jedes einzelnen Status nach auth suchen, können Sie den authentifizierten Benutzer an jeden der Controller übergeben. Es ist kein lokaler Speicher erforderlich, da das zugrunde liegende Firebase-SDK dies für Sie übernimmt.

Es kann hilfreich sein, zusätzliche Informationen zu der von Ihnen verwendeten Anleitung bereitzustellen.

diese Dokumentation hier https://github.com/firebase/angularfire/blob/master/docs/guide/user-auth.md#authenticating-with-routers ist alt, aber das Muster kann noch effektiv

+0

Ich benutze Lynda.com und die Firebase/Angularfire-Dokumentation. Beide Ressourcen neigen dazu, die Verwendung von $ firebaseAuth vorzuschlagen und einen Listener zu verwenden, um festzustellen, ob sich das Berechtigungsobjekt geändert hat. Es funktioniert, aber es sieht hässlich aus. Ich bin kein Fan davon, fast alle meine Funktionalität innerhalb eines Listeners und innerhalb einer if-Anweisung zu verschachteln (die if-Anweisung überprüft, ob ein aktueller Benutzer angemeldet ist). – user3225440

+0

Es sieht so aus, als ob Sie die alten Versionen von beiden verwenden ... Sie sollten vielleicht ein Upgrade auf die neueste Version von Firebase in Betracht ziehen –

0

eine Fabrik erstellen verwendet werden, um die Auth-Eigenschaften zu speichern. Etwas wie das.

 app.factory('authService', function(){ 
     return{ 
     authenticated: false 
     }; 
    }); 

und dann für sie überprüfen in den Controllern:

$scope.authenticated = authService.authenticated; 

hoffe, das hilft irgendwie

PS Controller nur verwendet Modell anzuzeigen anzuzeigen und alle Funktionalitäten sollten in Einzelrichtlinien bewegt werden oder Dienstleistungen. Ihr Controller benötigt in Zukunft eine Säuberung.