2014-12-10 2 views
2

Я следую учебнику AngularFire по телефону thinkster. Служба $simpleLogin была обесценена, поэтому я изменил код.Углеродный учебник по мыслителю io статус входа не обновлен

Фабрика:

app.factory('Auth', function ($firebaseSimpleLogin, FIREBASE_URL, $rootScope, $location){ 
var ref = new Firebase(FIREBASE_URL); 
var Auth = { 
    register = function(){ 
     //... 
    }, 
    resolveUser = function(){ 
     //... 
    }, 
    signedIn = function(){ 
     var authData = ref.getAuth(); 
     if (authData) { 
      console.log("User is signed in"); 
      return true; 
     } else { 
      console.log("User is not signed in");     
      return false; 
     } 
    } 

Контроллер:

app.controller('NavCtrl', ['$scope', '$location', 'Post', 'Auth', function ($scope, $location, Post, Auth){ 
    $scope.post = {url: 'http://', title: ''}; 

    $scope.submitPost = function(){ 
     Post.create($scope.post).then(function (ref){ 
      $location.path('/posts/' + ref.name()); 
      $scope.post = {url: 'http://', title: ''}; 
     }) 
    }; 

    $scope.signedIn = Auth.signedIn(); 
    $scope.logout = Auth.logout; 
}]); 

app.config(function($routeProvider){ 
$routeProvider 
    .when('/', { 
    templateUrl: 'views/posts.html', 
    controller: 'PostsCtrl' 
    }) 
    .when('/posts/:postId', { 
    templateUrl: 'views/showpost.html', 
    controller: 'PostViewCtrl' 
    }) 
    .when('/register', { 
    templateUrl: 'views/register.html', 
    controller: 'AuthCtrl', 
    resolve: { 
     user: function(Auth){ 
      return Auth.signedIn(); 
     } 
    } 
    }) 
    .when('/login', { 
    templateUrl: 'views/login.html', 
    controller: 'AuthCtrl', 
    resolve: { 
     signedIn: function(Auth){ 
      return Auth.signedIn(); 
     } 
    } 
    }) 
    .otherwise({ 
    redirectTo: '/' 
    });     

Соответствующая часть шаблона:

<ul class="nav navbar-nav navbar-right"> 
    <li ng-show="signedIn"> 
    <a ng-href="#" ng-click="logout()">Logout</a>  
    </li> 
    <li ng-hide="signedIn"> 
    <a href="#/register">Register</a> 
    </li> 
    <li ng-hide="signedIn"> 
    <a href="#/login">Login</a> 
    </li> 

Проблема является signedIn переменная не обновляется, когда я войдите в систему, поэтому ссылки регистрации и входа в систему по-прежнему отображаются пользователю во время выхода из системы l чернила не показаны.

ответ

0

Наконец выяснить решение,

В контроллере:

$scope.auth = Auth.auth(); 
    $scope.auth.$onAuth(function(authData){ 
    $timeout(function(){ 
     $scope.user = authData; 
    }); 
    }); 

на заводе:

var ref = new Firebase(FIREBASE_URL); 
    var auth = $firebaseAuth(ref); 
    var Auth = { 
     auth: function(){ 
      return auth; 
     } 
     } 

    Return Auth; 

Так что я думаю, что это $timeout, что делает разницу?

1

Вы контроллер устанавливает signedIn следующим образом:

$scope.signedIn = Auth.signedIn(); 

Когда контроллер инициализируется, этот код выполняется, и переменная сфера устанавливается только один раз.

Если вы посмотрите в Firebase documentation for monitoring authentication state, вы найдете этот пример как раз выше той, кажется, начали с:

ref.onAuth(function(authData) { 
    if (authData) { 
    // user authenticated with Firebase 
    console.log("User ID: " + authData.uid + ", Provider: " + authData.provider); 
    } else { 
    // user is logged out 
    } 
}); 

Где ваши чеки сниппет (с использованием getAuth) является ли пользователь в настоящее время вошли в систему, это не контролирует ссылочный Firebase (с помощью onAuth) до входа пользователя в на этом этапе вы можете установить/обновить вашу собственность в объеме и уведомить AngularJS об изменении:.

$scope.signedIn = !!ref.getAuth(); // true if the user is already logged in 
ref.onAuth(function(authData) { 
    $scope.signedIn = !!ref.getAuth(); 
    $scope.$apply(); 
}); 

в случае, если вы alread у с помощью AngularFire, вы можете просто использовать $firebaseAuth сервис, который поставляется вместе с ним и сделать то же самое: https://www.firebase.com/docs/web/libraries/angular/guide.html#section-angular-authentication

+0

спасибо за помощь, не знаю, как точно ее реализовать (я новичок), но достаточно, чтобы установить меня на правильный путь. Наконец, я обнаружил, что использование $ timeout с $ onAuth может привести к результату, который я хочу. – user2901633

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