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