4

В настоящее время у меня есть система авторизации для отслеживания состояния входа/выхода пользователя с помощью углового огня. Руководство, на которое я смотрю, предполагает использование $ onAuthStateChanged в каждом контроллере.

$rootScope.authObj.$onAuthStateChanged(function(firebaseUser) { 
    if (firebaseUser) { 
     console.log("Signed in as:", firebaseUser.uid); 
     }); 
    } else { 
     console.log("Signed out"); 
    } 
    }); 

Вместо этого я использую переменную $ rootScope.session отслеживать мой вошедшего в систему пользователя. Это работает отлично по большей части, но я не могу получить доступ к этой переменной сеанса в начале других контроллеров, поскольку объект не создается в этой точке. Есть ли чистый способ доступа к этой переменной сеанса в области контроллера, поэтому мне не нужно делать новую ссылку на базу данных в каждой функции (поскольку эти функции вызывается после установки переменной сеанса).

Чтобы сделать вещи более понятными.

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

В верхней части моего контроллера не работает, поскольку $ rootScope.session.id еще не установлен.

Но

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

};

Работает как функция, вызываемая нажатием кнопки, которая всегда будет после того, как страница уже загружена, что означает, что $ rootScope.session.id установлен этой точкой.

------------- Update -----------------

Я получил его на работу, используя firebases предложил методология, но она не выглядит красивой. Он включает вложение всего внутри слушателя объекта Auth firebase, а затем использование оператора if для обеспечения того, чтобы объект пользователя не был нулевым.

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 

}]); 

ответ

2

$rootScope плохой вариант для этого вида хранения, поскольку она очищается каждый раз, когда вы обновите страницу.

Вы должны быть в порядке ngStorage. Он поставляется с $localStorage и $sessionStorage, прочитайте, чтобы узнать, что лучше подходит для ваших нужд.

Затем добавьте ngStorage в модуль и введите $localStorage в контроллеры.

$localstorage.sessionId = id; 

Это будет хранить идентификатор в вашем браузере.

+0

Спасибо, я попробую! – user3225440

2

angularfire будет отслеживать сеансы для вас и поддерживать текущую информацию пользователя. Если вы проверяете auth в разрешении каждого из ваших состояний, вы можете передать аутентифицированного пользователя в каждый из контроллеров ... нет необходимости в локальном хранилище, поскольку базовый SDK для firebase обрабатывает это для вас.

Возможно, вам будет полезно предоставить дополнительную информацию о руководстве, которое вы используете.

эта документация здесь https://github.com/firebase/angularfire/blob/master/docs/guide/user-auth.md#authenticating-with-routers старая, но картина все еще может быть эффективно использована

+0

Я использую Lynda.com и документацию firebase/angularfire. Оба ресурса склонны предлагать использовать $ firebaseAuth и использовать прослушиватель, чтобы увидеть, изменился ли объект авторизации. Это работает, но выглядит уродливо. Я не являюсь поклонником того, что нужно вложить все мои функции в слушателя и внутри оператора if (проверка оператора if, чтобы увидеть, есть ли текущий пользователь, зарегистрированный). – user3225440

+0

похоже, что вы используете старые версии обоих ... вы можете рассмотреть возможность обновления до последней версии Firebase –

0

Создать фабрику, чтобы сохранить свойства AUTH. Что-то вроде этого.

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

, а затем проверить его в контроллерах:

$scope.authenticated = authService.authenticated; 

Надеется, что это как-то помогает

контроллера PS используется только для отображения модели для просмотра и любые функциональные возможностей должны быть перемещены в отдельных директивах или Сервисы. Ваш контроллер нуждается в очистке в будущем.

Смежные вопросы