在AngularFire中,为什么控制器中的auth.user属性为null,而不是视图?

时间:2014-05-06 01:05:51

标签: angularjs firebase

有用户登录Firebase,在我的视图中,$ scope.auth返回当前登录用户,我可以访问其数据。

但是在我的控制器中,$ scope.auth.user返回null。

myApp.controller('quoteController', ['$scope', '$firebase', '$firebaseSimpleLogin',
  function($scope, $firebase, $firebaseSimpleLogin) {

    $scope.auth = $firebaseSimpleLogin(dataRef);

    console.log($scope.auth.user);
  });

console.log($ scope.auth.user)==' null'。

为什么会这样?我知道用户已登录.angleFire文档说,即使创建了多个$ firebaseSimpleLogin对象,简单登录的登录状态对应用程序是全局的。"那么$ scope.auth.user是否应该包含当前用户?

2 个答案:

答案 0 :(得分:7)

登录需要异步联系服务器。您无法立即访问下一行的变量,因为尚未检索它。此外,您需要在用户对象存在之前调用login()。假设从另一个页面视图中持有登录名,或者已经调用了login(),您可以采取一些方法来完成您想要的操作。

使用$getCurrentUser()等待身份验证过程解析并获取当前经过身份验证的用户帐户:

angular.module("sampleApp", ["firebase"])
  .controller("SampleController", ["$scope", "$firebase", "$firebaseSimpleLogin",
    function($scope, $firebase, $firebaseSimpleLogin) {
      var ref = new Firebase("https://<my-firebase>.firebaseio.com/");
      $scope.auth = $firebaseSimpleLogin(ref);
      $scope.auth.$getCurrentUser().then(function(user) {
         console.log(user);
      });
    }
  ]);

利用auth events

angular.module("sampleApp", ["firebase"])
  .controller("SampleController", ["$scope", "$firebase", "$firebaseSimpleLogin",
    function($scope, $firebase, $firebaseSimpleLogin) {
      var ref = new Firebase("https://<my-firebase>.firebaseio.com/");
      $scope.auth = $firebaseSimpleLogin(ref);
      $scope.$on('$firebaseSimpleLogin:login', function() {
         console.log($scope.auth.user);
      });
    }
  ]);

或者您可以使用在调用login时返回的承诺:

angular.module("sampleApp", ["firebase"])
  .controller("SampleController", ["$scope", "$firebase", "$firebaseSimpleLogin",
    function($scope, $firebase, $firebaseSimpleLogin) {
      var ref = new Firebase("https://<my-firebase>.firebaseio.com/");
      $scope.auth = $firebaseSimpleLogin(ref);

      $scope.auth.$login('twitter').then(function() {
          console.log($scope.auth.user);
      });
    }
  ]);

答案 1 :(得分:2)

这很可能是由于调用firebaseSimpleLogin的异步性质造成的。甚至他们的例子也有回调

var auth = new FirebaseSimpleLogin(chatRef, function(error, user) {
  if (error) {
    // an error occurred while attempting login
    console.log(error);
  } else if (user) {
    // user authenticated with Firebase
    console.log('User ID: ' + user.uid + ', Provider: ' + user.provider);
  } else {
    // user is logged out
  }
});

如果您检查回调中的值,您应该会看到用户数据。