![](/img/trans.png)
[英]How to access $scope variable in one controller in another controller Using$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之前解決Authentication.login的承諾。
為了確保是這種情況,請嘗試在身份驗證服務的此行上設置一個斷點:
$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;
});
我不確定您使用服務/工廠的方式以及應用和控制器的設置方式。
我認為$ rootScope是應用程序最外部控制器的“頂級”范圍。 您可以為每個“應用程序”設置一個$ rootScope。
我猜想,如果您在其中一個應用程序的服務的$ rootScope中設置了變量,然后嘗試從ANOTHER應用程序的控制器從$ rootScope訪問服務,則將無法找到該變量,因為在另一個$ rootScope中。 從這個意義上說,$ rootScope不是全局變量。
如果在定義控制器時傳入“ $ rootScope”,則可以直接從子控制器訪問$ rootScope變量,也可以從子控制器的$ scope間接訪問$ rootScope變量,因為angular將從所有當前控制器的作用域中尋找變量。到達該控制器的$ rootScope的方式。
希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.