Javascript Can';无法从另一个控制器访问$rootScope

Javascript Can';无法从另一个控制器访问$rootScope,javascript,angularjs,angularjs-scope,Javascript,Angularjs,Angularjs Scope,为什么我不能从RegistrationController访问$rootScope,特别是currentUser对象和signedIn()函数 我正在尝试遵循一个教程示例,我能够成功地在服务(身份验证)中设置$rootScope.currentUser变量,但当我尝试从另一个控制器(RegistrationController)访问它时,我无法访问它 我的理解是,$rootScope是一种可以从所有应用程序访问的全局变量,对吗 myApp.controller('RegistrationCont

为什么我不能从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;
});

我不确定你的服务/工厂是如何使用的,你的应用程序和控制器是如何设置的

我认为$rootScope是应用程序最外层控制器的“顶级”范围。您可以为每个“应用程序”设置$rootScope

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

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


希望这能有所帮助。

看起来您正试图从RegistrationController.login()打印$rootScope.currentUser。但从未在$rootScope上设置currentUser。下面的示例演示如何在两个控制器上使用$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;
  });

我相信发生的是promise Authentication.login在currentUser设置$rootScope.currentUser=userObj之前被解析

要确保情况属实,请尝试在身份验证服务的此行上放置断点:

$rootScope.currentUser = userObj;
以及控制器中此断点上的另一个断点:

console.log($rootScope.currentUser);
看看哪一个先被执行

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

首先,提供一些plunkr或js fiddle示例。另外,写入任何作用域(也包括根作用域)标量(通过对象完成,即$scope.model.XXX)也不是一个好主意。另一件事:在rootScope中存储任何东西都不是一个好主意,而是将数据存储在服务中:您可以从任何“任何东西”(即控制器、指令等)访问它们。是的,根范围在AngularJS中是一种全局范围(就像全局变量一样)。你还记得使用它们不好吗?rootScope的情况也一样。不要用它来存储变量。你好@Sharikov Vladislav,谢谢你的评论。在询问之前,我做了一些研究,发现了您提到的关于服务的内容,但我正在学习一个教程,其中他们使用$rootScope,奇怪的是,我无法读取存储在那里的值。我知道使用全局变量不是一个好主意:)我对Plunker不是很熟悉,但我会尝试一下,然后根据结果进行编辑。Hi@restassured,在身份验证服务中,您可以找到以下代码,其中一个对象被分配给$rootScope<代码>userObj.$loaded()。然后(函数(){$rootScope.currentUser=userObj;})该代码在RegistrationController的
$scope.login
函数中执行。当我尝试使用控制器中的
console.log()
打印
$rootScope.currentUser
时,我得到了一个未定义的值。关于代码不同部分的执行时间,您是正确的。一个让我感到困惑的评论是,即使正确设置了
$rootScope.currentUser
(在控制器或服务中),我也无法从Chrome开发控制台访问$rootScope变量。我发现这个问题/答案澄清了主题。。。您可以使用Batarang chrome插件,也可以使用以下代码获取存储在$rootScope中的值<代码>$rootScope=angular.element(document.scope()