簡體   English   中英

AngularJS:從控制器訪問連接的用戶信息

[英]AngularJS: Access connected user info from controller

我在AngularJS方面苦苦掙扎,並在此處訪問已連接的用戶信息。 我的目標是將已連接用戶的信息保存在服務中,以便在整個應用程序中都可用。 所以這就是我的做法:

登錄功能通過登錄服務公開,其代碼如下:

(function(){
var $loginService = angular.module("RockMyTask.LoginService", [
    "satellizer",
    "RockMyTask.ApiService"
]);

/**
 * Login service
 *
 * function login(identifier, password, after)
 *  Logs the given user. Global data about the user are registered in the root scope.
 *  @param identifier The user's identifier (either email or password)
 *  @param password The user's password
 *  @param success (optional) A callback to execute when the user is successfully logged in. This callback is passed
 *  the response object.
 *  @param failure (optional) A callback to execute when the log in fails. This callback is passed the response
 *  object.
 *
 * function restore()
 *  If the user was already logged in, restore the user data in the rootScope.
 *
 * function connectedUser()
 *  Return the data of the currently connected user. If the user is not connected an empty object is returned.
 *  If the user data hasn't be fetched yet, then an empty object is returned and this object will be filled with
 *  the user data as soon as it is received.
 */
$loginService.factory("Login", ["$auth", "$rootScope", "User",
    function($auth, $rootScope, User) {
    var obj = {};
    var connectedUser = {};

    obj.logout = function() {
        $auth.logout();
        //Authorization.clear();
        connectedUser = null;
    };

    obj.login = function(identifier, password, success, failure) {
        var credentials = {
            user_identifier: identifier,
            password: password
        };

        $auth.login(credentials).then(function(auth_response) {
            // fetch user data (with both spectator and rockstar flags set to true)
            User.me(true, true).then(function(response) {
                connectedUser = response.data;
                //TODO add check for DEBUG_MODE
                console.log("Received connected user data and stored it in connectedUser var");
            }, function() {
                connectedUser = {};
            });

            // execute provided success callback
            if (_.isFunction(success)) {
                success(auth_response);
            }
        }, function(response) {
            connectedUser = null;

            // execute provided failure callback
            if (_.isFunction(failure)) {
                failure(response);
            }
        });
    };

    obj.restore = function() {
        if ($auth.isAuthenticated()) {
            User.me(true, true).then(function(response) {
                connectedUser = response.data;
            }, function() {
                connectedUser = null;
            });
        } else {
            connectedUser = null;
        }
    };

    obj.getConnectedUser = function(){
        if($auth.isAuthenticated && !connectedUser){
            User.me(true, true).then(function(response) {
                connectedUser = response.data;
            }, function() {
                connectedUser = null;
            });
        }
        return connectedUser;
    };

    obj.updateUserInfo = function(user){
        connectedUser = user;
    };

    obj.isConnectedUserRockstar = function(){
        return connectedUser.rocker != null;
    };
    obj.isConnectedUserSpectator = function(){
        return connectedUser.spectator != null;
    };

    return obj;
}]);
})();

您可能會在代碼中看到,成功登錄后,我啟動一個HTTP請求( User.me(true, ture) ),然后將返回的數據(代表有關已連接用戶的信息)存儲在該服務的臨時變量connectedUser

要從應用程序的任何位置訪問連接的用戶信息,我已經在Login服務中實現了一個名為getConnectedUser的函數,其代碼在此處報告:

obj.getConnectedUser = function(){
        if($auth.isAuthenticated && !connectedUser){
            User.me(true, true).then(function(response) {
                connectedUser = response.data;
            }, function() {
                connectedUser = null;
            });
        }
        return connectedUser;
    };

此函數檢查用戶是否確實已通過身份驗證,以及變量connectedUser是否已正確填充,否則,它將再次觸發HTTP函數以檢索數據(否則,它僅返回connectedUser var)。

現在,我的問題如下。 成功登錄后,我將用戶重定向到的頁面使用控制器,我已將Login服務傳遞給該控制器。 控制器嘗試檢索連接的用戶信息,但結果為空指針。 我究竟做錯了什么??

控制器中的代碼(以防萬一,即使非常簡單):

$scope.user = Login.getConnectedUser();

編輯1查看瀏覽器中的控制台,我看到HTTP請求成功,返回的數據為:

{"id":3,"email":"iCartwright@hotmail.com","name":"Michele","surname":"Imperiali","locale":"it_IT","picture":"https:\/\/storage.rockmytask.it\/users\/profile_image\/3.jpeg","birthday":"1982-06-23","gender":"M","country":"IT","province":"Lombardia","city":"Milano","zip":"20100","street":"190 Grover Expressway","mobile_phone":"(437)924-8282","home_phone":"239-250-3166x783","username":"spectator","validated":true,"timezone":"Europe\/Rome","created_at":"2016-04-01T12:50:53+0000","rocker":null,"spectator":{"description":"I need help with my garden !"}}

如前所述,當我嘗試訪問控制器中$scope.user的變量時,出現空指針異常。

我認為這個問題與

, function() {
            connectedUser = null;
        }

您是否有理由將connectedUser設置為null? 如果原因是因為如果后端出現錯誤或返回錯誤,則要將其設置為null,請執行以下操作:

obj.getConnectedUser = function(){
    if($auth.isAuthenticated && !connectedUser){
        User.me(true, true).then(function(response) {
            connectedUser = response.data;
        }, function(error) {
            connectedUser = null;
        });
    }
    return connectedUser;
};

然后,這只會在您收到錯誤響應時才將connectUser設置為null。截至目前,看來connectedUser總是被設置為null並解釋了null指針。

暫無
暫無

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

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