无法从另一个控制器访问 $rootScope

Can't access $rootScope from another controller

为什么我无法从 RegistrationController 访问 $rootScope,尤其是 currentUser 对象和 signedIn() 函数?

我正在尝试按照教程示例进行操作,并且能够在服务(身份验证)中成功设置 $rootScope.currentUser 变量,但是当我尝试从另一个控制器(RegistrationController)访问它时,我无法访问它。

我的理解是 $rootScope 是一种可以从所有应用程序访问的全局变量,对吗?

myApp.controller('RegistrationController', 
    function($scope, $firebaseAuth, $location, Authentication, $rootScope){

    $scope.login = function() {
        Authentication.login($scope.user)
        .then(function(userReturned){
            console.log('registration.js: logged in user '+userReturned.uid);
            //console.log('registration.js: $rootScope.currentUser ahora es... ');
            //console.log($rootScope.currentUser);
            $location.path('/meetings');
        })
        .catch(function(error) {
            $scope.message = error.toString();
        });
    } //login


}); //RegistrationController

myApp.factory('Authentication', 
    function($firebase, $firebaseAuth, FIREBASE_URL, $location, $rootScope) {
    // using $firebaseAuth instead of SimpleLogin 

    var ref = new Firebase(FIREBASE_URL);
    var authObj = $firebaseAuth(ref);

    var myObject = {
        login : function(user) {

            return authObj.$authWithPassword({
                email: user.email,
                password: user.password
            })
            .then(function(authData){ 
                console.log('authentication.js: logged in user '+ authData.uid);

                var userRef = new Firebase(FIREBASE_URL + 'users/' + authData.uid);
                var userObj = $firebase(userRef).$asObject();

                userObj.$loaded().then(function() {
                    $rootScope.currentUser = userObj;
                });

                $rootScope.$broadcast('$firebaseAuth:authWithPassword',authData); // avisa al scope

              return authData;
          });
        }, //login

        signedIn: function() {
            //console.log(authObj);
            //console.log('authentication.js: signedIn function called and returned '+ (authObj.user != null) );
            return authObj.user != null;
        } // signedIn

    } //myObject

    // add signedIn to the $rootScope
    $rootScope.signedIn = function() {
        return myObject.signedIn();
    }

    return myObject;
});

我不太确定您如何使用 service/factory 以及您的应用程序和控制器是如何设置的。

我认为 $rootScope 是您应用程序最外层控制器的 "top" 范围。您可以为每个 "app" 设置一个 $rootScope。

我猜想,如果您在某个应用程序的服务中的 $rootScope 中设置了一个变量,然后尝试通过另一个应用程序的控制器从 $rootScope 访问您的服务,您将无法找到变量,因为它在另一个 $rootScope 中。 从这个意义上说 $rootScope 不是全局变量。

如果您在定义控制器时传入“$rootScope”,您可以直接从子控制器访问 $rootScope 变量,或者从子控制器的 $scope 间接访问,因为 angular 将寻找从当前控制器的范围一直到该控制器的 $rootScope 的变量。

希望这对您有所帮助。

您似乎在尝试从 RegistrationController.login() 打印 $rootScope.currentUser。但是 currentUser 从未在 $rootScope 上设置。这是一个演示在两个控制器上使用 $rootScope 的示例。

angular.module('Main', [])
  .controller("SetCtrl", function($scope, $rootScope) {
    $scope.name = 'abc';
    $rootScope.copy = $scope.name;
  })
  .controller("GetCtrl", function($scope, $rootScope) {
    $scope.fromSetCtrl = $rootScope.copy;
  });

http://plnkr.co/edit/dj6Y9hIEJ3KA9yAjuQP5

我相信正在发生的事情是承诺 Authentication.login 在设置 currentUser 之前得到解决 $rootScope.currentUser = userObj;

为确保是这种情况,请尝试在身份验证服务的这一行上放置一个断点:

$rootScope.currentUser = userObj;

以及您控制器中此断点的另一个断点:

console.log($rootScope.currentUser);

并查看哪个在另一个之前执行。

如果是这种情况,请尝试以下操作: 将 [THEN] 语句中的代码块从您的服务移动到您的控制器,您正在处理当前用户并记录它。