Angularjs 在AngularFire中,为什么auth.user属性在控制器中为空,而在视图中为空?

Angularjs 在AngularFire中,为什么auth.user属性在控制器中为空,而在视图中为空?,angularjs,firebase,Angularjs,Firebase,有一个用户登录到Firebase,在我的视图中,$scope.auth返回当前登录的用户,我可以访问其数据 但是,在我的控制器中,$scope.auth.user返回null myApp.controller('quoteController', ['$scope', '$firebase', '$firebaseSimpleLogin', function($scope, $firebase, $firebaseSimpleLogin) { $scope.auth = $fire

有一个用户登录到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'


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

这很可能是由于调用
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
  }
});

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

登录需要异步联系服务器。您无法立即访问下一行的变量,因为尚未检索该变量。此外,在用户对象存在之前,需要调用login()。假设存在来自另一个页面视图的持久化登录,或者调用了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.$getCurrentUser().then(function(user) {
         console.log(user);
      });
    }
  ]);
angular.module(“sampleApp”,[“firebase”])
.controller(“SampleController”、[“$scope”、“$firebase”、“$firebaseSimpleLogin”,
函数($scope、$firebase、$firebaseSimpleLogin){
var ref=新的火基(“https://.firebaseio.com/");
$scope.auth=$firebaseSimpleLogin(参考);
$scope.auth.$getCurrentUser().then(函数(用户){
console.log(用户);
});
}
]);
利用:

angular.module(“sampleApp”,[“firebase”])
.controller(“SampleController”、[“$scope”、“$firebase”、“$firebaseSimpleLogin”,
函数($scope、$firebase、$firebaseSimpleLogin){
var ref=新的火基(“https://.firebaseio.com/");
$scope.auth=$firebaseSimpleLogin(参考);
$scope.$on(“$firebaseSimpleLogin:login”,函数(){
log($scope.auth.user);
});
}
]);
或者,您可以在调用时使用返回的承诺:

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);
      });
    }
  ]);
angular.module(“sampleApp”,[“firebase”])
.controller(“SampleController”、[“$scope”、“$firebase”、“$firebaseSimpleLogin”,
函数($scope、$firebase、$firebaseSimpleLogin){
var ref=新的火基(“https://.firebaseio.com/");
$scope.auth=$firebaseSimpleLogin(参考);
$scope.auth.$login('twitter')。然后(function(){
log($scope.auth.user);
});
}
]);

完全正确,但是,$firebaseSimpleLogin是angularFire库的一部分,其工作方式略有不同(使用$rootScope上广播的事件或使用登录/注销方法上的承诺)好的,我没有使用AngulFire库的经验,这是基于示例:)感谢详细的回答@加藤。因此,如果您想在随机控制器中使用类似于
user.uid
的东西,需要使用以下方法之一引入
user.uid
?这个变量似乎已经存在于应用程序中,只是好奇在我的不同控制器中是否有其他方法访问它。@KylePennell请查看存储它的angularFire seed,因此任何控制器都需要调用simpleLogin.user或simpleLogin.getUser()。更好的是,您可以使用
解析
和。
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);
      });
    }
  ]);