无法从另一个控制器访问 $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;
});
我相信正在发生的事情是承诺 Authentication.login 在设置 currentUser 之前得到解决 $rootScope.currentUser = userObj;
为确保是这种情况,请尝试在身份验证服务的这一行上放置一个断点:
$rootScope.currentUser = userObj;
以及您控制器中此断点的另一个断点:
console.log($rootScope.currentUser);
并查看哪个在另一个之前执行。
如果是这种情况,请尝试以下操作:
将 [THEN] 语句中的代码块从您的服务移动到您的控制器,您正在处理当前用户并记录它。
为什么我无法从 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;
});
我相信正在发生的事情是承诺 Authentication.login 在设置 currentUser 之前得到解决 $rootScope.currentUser = userObj;
为确保是这种情况,请尝试在身份验证服务的这一行上放置一个断点:
$rootScope.currentUser = userObj;
以及您控制器中此断点的另一个断点:
console.log($rootScope.currentUser);
并查看哪个在另一个之前执行。
如果是这种情况,请尝试以下操作: 将 [THEN] 语句中的代码块从您的服务移动到您的控制器,您正在处理当前用户并记录它。