簡體   English   中英

無法從其他控制器訪問$ 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;
  });

http://plnkr.co/edit/dj6Y9hIEJ3KA9yAjuQP5

我不確定您使用服務/工廠的方式以及應用和控制器的設置方式。

我認為$ rootScope是應用程序最外部控制器的“頂級”范圍。 您可以為每個“應用程序”設置一個$ rootScope。

我猜想,如果您在其中一個應用程序的服務的$ rootScope中設置了變量,然后嘗試從ANOTHER應用程序的控制器從$ rootScope訪問服務,則將無法找到該變量,因為在另一個$ rootScope中。 從這個意義上說,$ rootScope不是全局變量。

如果在定義控制器時傳入“ $ rootScope”,則可以直接從子控制器訪問$ rootScope變量,也可以從子控制器的$ scope間接訪問$ rootScope變量,因為angular將從所有當前控制器的作用域中尋找變量。到達該控制器的$ rootScope的方式。

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM