可以't从另一个控制器访问$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;
});
我相信在设置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查找变量。
希望这能有所帮助。
- 从AngularJS中的另一个文件中的控制器访问服务
- 如何从AngularJs中的另一个控制器访问控制器
- 从控制器访问mixin属性
- 如何从 angularjs 控制器访问$resource
- AngularJS:从控制器访问特定的指令范围
- 从角度控制器访问模板元素
- 可以't从另一个控制器访问$rootScope
- 如何创建可以使用 AngularJS 上的控制器访问的帮助程序类
- 从 Angular 控制器访问不同模块中的角度服务
- 从服务器控制器访问 MEANjs 中的 API 端点
- 从 angularjs 控制器访问外部 JavaScript 函数和类
- 如何从父指令/控制器访问指令范围
- 角度指令 - 需要从指令控制器访问所需的控制器
- Angular js 指令控制器访问范围属性,但返回未定义
- AngularJS :如何从相同的指令控制器访问指令范围
- 通过控制器访问$rootScope不起作用
- 无法从子控制器访问父控制器的方法
- 有没有办法从木偶.js中的显示控制器访问在列表控制器中创建的布局区域
- 如何与AngularJs在控制器之间共享$scope,我们可以从另一个控制器访问一个控制器的$scope
- 如何以角度将$scope从一个控制器访问到另一个控制器