0

假设我将 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

4 回答 4

2

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

您可能根本不需要 $scope.auth。Firereader 使用它是因为它需要将一些额外的数据放入用户对象中,特别是在 ng-switch 语句中使用的布尔值。在您的情况下,您可能只使用由 angularFireAuth 设置的 $scope.user,而不用打扰 $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);
});
于 2013-09-10T16:02:27.023 回答
1

感谢 Tom Chen 的第二个示例,我正在使用 angularfire 的身份验证,如下所示:

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 
}); 
于 2014-01-21T18:36:45.403 回答
0

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

最好检查身份验证何时在子范围内完成。

于 2013-09-05T11:49:12.950 回答
0

我会替换angularFireangular-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将反映在$rootScopeauth 变量中。
如果用户登录,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);
}]);
于 2013-09-10T18:22:42.623 回答