可以't从另一个控制器访问$rootScope

Can't access $rootScope from another controller

本文关键字:控制器 访问 rootScope 另一个 可以      更新时间:2023-09-26

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

我相信在设置currentUser$rootScope.currentUser=userObj;

要确保情况确实如此,请尝试在身份验证服务的这一行上设置一个断点:

$rootScope.currentUser = userObj;

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

console.log($rootScope.currentUser);

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

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

看起来您正试图从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

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

我认为$rootScope是应用程序最外层控制器的"顶部"作用域。您可以为每个"应用程序"设置$rootScope。

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

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

希望这能有所帮助。