Firebase的AngularFire身份验证$ onAuth抛出“Undefined不是函数”

时间:2014-11-26 17:21:08

标签: angularjs firebase angularfire

我尝试将应用程序升级到新的Firebase身份验证方法。我已经完成了大部分工作,但出于某种原因,当我尝试这个时。

myApp.controller('StatusController', function(
  $scope, $rootScope,
    $location, $firebase, $firebaseAuth, FIREBASE_URL) {

  $scope.logout = function() {
    Authentication.logout();
    $location.path('/login');
  } //logout

  $rootScope.$onAuth(function(authUser) {
    var ref = new Firebase(FIREBASE_URL + '/users/' + authUser.uid);
    var user = $firebase(ref).$asObject();

    user.$loaded().then(function() {
      $rootScope.currentUser = user;
    });
  }); //login

  $rootScope.$on('logout', function(e, authUser) {
    $rootScope.currentUser = null;
  }); //login

}); //StatusController

我得到一个"未定义的不是函数",即使我只是在网站上尝试这个例子。我不确定为什么会这样。仅供参考,此控制器会跟踪身份验证以更新站点导航。

<header>
  <nav class="cf" ng-include="'views/nav.html'"
    ng-controller="StatusController"></nav>
</header>

2 个答案:

答案 0 :(得分:3)

你可以解决这样的问题,理想情况下你会使用$ rootScope,但这种方式也可以在不使用$ rootScope的情况下运行,因为Firebase员工似乎以类似rootScope的方式实现了$ onAuth。

作为您的应用程序的示例:

myApp.controller('StatusController', function($scope,$firebase,$firebaseAuth,FIREBASE_URL) {
    var ref = new Firebase(FIREBASE_URL);
    var auth = $firebaseAuth(ref);

    auth.$onAuth(function(authData){
        console.log(authData);
        $scope.userStatus = authData.password.email;
    }); // Check user status 
}); // StatusController

PS:authData.password.email仅将电子邮件地址插入$ scope.userStatus。

答案 1 :(得分:0)

用$ timeout包装$ onAuth函数,使其在摘要循环中处理!

// wrap the $onAuth function with $timeout so it processes
    // in the digest loop.
    onAuth: function onLoggedIn(callback) {
      auth.$onAuth(function(authData) {
        $timeout(function() {
          callback(authData);
        });
      });
    }