2015-02-08 120 views
0

为什么我无法访问$rootScope,特别是RegistrationController中的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; 
}); 
+1

首先,提供一些plunkr或js小提琴示例。另外,写任何一个作用域(以及rootScope也是如此)标量(通过对象执行,例如$ scope.model.XXX)并不是一个好主意。另一件事:在rootScope中根本不存储任何内容,而是将数据存储在服务中:您可以从任何“任何东西”(即控制器,指令等)访问数据。是的,rootScope在AngularJS中具有全局作用域(如全局变量)。你还记得使用它们不好吗?与rootScope相同的情况。不要用它来存储变量。 – 2015-02-08 21:40:06

+0

嗨@Sharikov弗拉迪斯拉夫,感谢您的评论。在询问之前,我做了一些调查,并且发现了你提到的有关服务的内容,但是我正在按照他们使用$ rootScope的教程进行操作,看起来很奇怪,我无法读取存储在那里的值。我知道使用全局变量不是一个好主意:) 我对Plunker并不是很熟悉,但我会试一试并用结果进行编辑。 – 2015-02-08 23:01:29

回答

3

相信发生了什么是承诺Authentication.login被设定currentUser解决之前,$ rootScope.currentUser = userObj;

,以确保这种情况下,尝试将断点在此行中的身份验证服务:

$rootScope.currentUser = userObj; 

,并在这一个在你的控制器另一个断点:

console.log($rootScope.currentUser); 

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

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

+0

关于代码不同部分的执行时间,您是正确的。对未来引用的评论引起了我的困惑,即使在正确设置了$ rootScope.currentUser的情况下(无论是在控制器还是在服务中),我都无法从Chrome开发者控制台访问$ rootScope变量。 – 2015-02-09 14:46:05

+0

我发现这个问题/答案,澄清主题... http://stackoverflow.com/questions/13170732/how-to-debug-the-rootscope-object-of-angularjs-when-in-the-browser/13170943#13170943 您可以使用Batarang chrome插件或以下代码来获取存储在$ rootScope中的值。 '$ rootScope = angular.element(document).scope()' – 2015-02-09 14:46:38

-1

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

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

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

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

希望这会有所帮助。

0

它看起来像你试图从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

+0

嗨@restassured,在验证服务中,您可以找到此代码,其中一个对象分配给$ rootScope ... 'userObj。$ loaded()。then(function(){ $ rootScope.currentUser = userObj; });' 该代码在RegistrationController的'$ scope.login'函数中执行。当我尝试从控制器使用'console.log()'打印'$ rootScope.currentUser'时,我得到一个未定义的值。 – 2015-02-08 22:58:37

相关问题