如何在控制器和服务中使用angularFireAuth值?

时间:2013-09-05 10:18:07

标签: angularjs angularfire

我想把angularFireAuth放在服务中。

app.factory('authService',
function($rootScope, $timeout, angularFireAuth, FIREBASE_URL) {
    return function() {
        angularFireAuth.initialize(new Firebase(FIREBASE_URL), {
            scope: $rootScope,
            name: 'user',
            path: "/"
        });
        $rootScope.$on('angularFireAuth:login', function _set(evt, user) {
            $timeout(function() {
                $rootScope.auth = {
                    authenticated: true
                   };
            });
         });
        $rootScope.$on('angularFireAuth:logout', function(){
            $timeout(function() {
                $rootScope.auth = {
                    authenticated: false
                   };
            });    
        });
      }
    });

然后我在.run()

中初始化它
.run(['$rootScope', 'authService', function($rootScope, authService){
  authService();
});

我的问题是如何在其他服务和控制器中使用$scope.auth.authenticated

我在控制器中console.log($scope.auth.authenticated)。它总是返回假。好像它没有收听/观看登录

或者

我可以直接在控制器中使用$ scope.user并监听吗?

更新

我创建了一个plunker

4 个答案:

答案 0 :(得分:2)

问题是$ scope.user(以及扩展名$ scope.auth)在登录发生之前不会创建,直到单击登录按钮。但是一旦创建控制器(onDOMReady)就会发生console.log事件。

您可能根本不需要$ scope.auth。 Firereader正在使用它,因为它需要一些额外的数据放入用户对象,特别是在ng-switch语句中使用的布尔值。在您的情况下,您可以使用$ scope.user,它由angularFireAuth设置,而不是使用$ scope.auth对象。

因此,总而言之,如果您将console.log移动到等待登录完成,它将按预期工作:http://plnkr.co/edit/Bd23DGFtEpqO2g4jo06v?p=preview

var app = angular.module('plunker', ['firebase']);

app.constant('FIREBASE_URL', 'https://newname.firebaseio.com/');
app.run(['$rootScope', 'authService', function($rootScope, authService){
    authService();
    $rootScope.$watch('auth.authenticated', function() {
        isAuthenticated = $rootScope.auth.authenticated;
    });
}]);

app.factory('authService', [
    '$rootScope',
    '$timeout',
    'angularFireAuth',
    'FIREBASE_URL',

    function($rootScope, $timeout, angularFireAuth, FIREBASE_URL) {
        return function() {
            angularFireAuth.initialize(new Firebase(FIREBASE_URL), {
                scope: $rootScope,
                name: 'user'
            });

            $rootScope.$on('angularFireAuth:login', _log);

            function _log(evt, user) {
                // this is where $scope.user and $scope.auth will be set
                  console.log($scope.user);
             }
        }
    }
]);



app.controller('MainCtrl', function($scope, authService, angularFireAuth) {
  $scope.name = 'World';

  $scope.login = function(){
    angularFireAuth.login('facebook');
  }

  $scope.logout = function(){
    angularFireAuth.logout();
  }

  // angularFireAuth hasn't returned yet at this point
  // console.log($scope.auth);
});

答案 1 :(得分:1)

感谢Tom Chen的第二个例子,我正在使用angularfire的auth:

myapp.controller("UserController", ["$scope", "$firebase", "$firebaseSimpleLogin",       function($scope, $firebase, $firebaseSimpleLogin) {
var ref = new Firebase("https://XXXXXX.firebaseio.com/");
$scope.auth = $firebaseSimpleLogin(ref);

$scope.$watch('auth', function(newAuth, oldAuth){
    console.log(newAuth, oldAuth);
    // logged in, 
    // can reference newAuth.user.id
  }, true);

}]);

更新

此示例也是回调

$scope.$on("$firebaseSimpleLogin:login", function(e, user) {
  // can reference user.id 
}); 

答案 2 :(得分:0)

我可以想到为什么这不起作用的一个原因可能是本地范围正在影响$ rootScope上声明的变量。可能已经对本地范围对象auth进行了分配。您可以通过放置一些断点并验证$rootScope.auth$scope.auth的值来在firebug或chrome工具中验证这一点。

最好检查auth在子范围内何时完成。

答案 3 :(得分:0)

我会将angularFire替换为angular-on-fire并使用提供的fireEntry服务。

module('app.auth', ['angular-on-fire'])
.constant({FirebaseUrl: "https://YOUR_FB_NAME.firebaseIO.com/"})
.run(['$rootScope', 'fireEntry', function($rootScope, fireEntry){
  var auth = {};
  $rootScope.auth = auth;
  fireEntry(auth);
}]]);

因此,对auth的任何更新都会反映在$rootScope身份验证变量中 如果用户已登录,auth将包含FirebaseSimpleLogin提供的用户信息。注销后,auth将为空。

您现在可以在$rootScope.auth上观看以接收任何身份验证更新!

module('app.ctrl', ['app.auth']).controller('HomeCtrl', ['$scope', function($scope){
  $scope.$watch('auth', function(newAuth, oldAuth){
    console.log(newAuth, oldAuth);
  }, true);
}]);