直接从控制器Angular访问时,Factory属性为null

时间:2014-05-02 09:12:47

标签: angularjs angularjs-service angularjs-controller

我正在尝试使用angular和rest api构建简单的loggin,我在检查用户是否登录到登录表单控制器时遇到了奇怪的问题。

这是我的代码:

每次刷新我的应用程序时,它都会加载当前登录的用户

angular.module('myApp').run(['security', function(security) {
    security.requestCurrentUser();
}]);

安全模块是这样的(简单,灵感来自angular-app)

angular.module('security').factory('security', ['SERVER_CONFIG', '$http', '$q', '$location', 'securityRetryQueue',
    function (SERVER_CONFIG, $http, $q, $location, queue) {

        var service = {

            currentUser : null,

            isAuthenticated : function () {
                return !!service.currentUser;
            },

            login :
                  ....    
            },

            logout : 
                  ....
            },

            requestCurrentUser : 
                  ...
            }
        };

        return service;
}]);

因此它包含有关当前用户的数据并使用isAuthenticated您可以找到用户是否已登录

angular.module('security.login').controller('LoginFormCtrl', ['$scope', 'security', function ($scope, security) {

    console.log(security)
    console.log(security.currentUser)
    console.log(security.isAuthenticated())

}]);

console.log(security)返回属性用户填充用户数据的对象,因此方法isAuthenticated返回true

但奇怪的是:

security.user 返回 null security.isAuthenticated()返回 false ,我不明白为什么用户为null ... 我需要它来访问登录页面时重定向,用户已经登录。我知道角度应用程序使用模态,这样可以解决我的问题,但我不想使用模态...

如果有人能解释我做错了什么,我会很高兴......

非常感谢Blažek

1 个答案:

答案 0 :(得分:0)

您的应用程序在命名方面有点混乱,这可能会导致一些冲突。您的模块名为' security'并且你的工厂被命名为“安全性”,这很快就会被注入哪个地方。因此,尝试将某些内容重命名为“securityModule'和' securityFactory'区分。

现在,我通常通过应用程序持久保存数据的方式是使用如下结构的服务:

angular.module('security').service('security', ['SERVER_CONFIG', '$http', '$q', '$location', 'securityRetryQueue', function (SERVER_CONFIG, $http, $q, $location, queue) { // data that is persisted var currentUser = null; var someOtherData = null; // internal functions function getCurrentUser(){ ... do stuff ... } function doOtherStuff(){ ... do stuff ... }
// public methods // for use in controllers return { getCurrentUser : function(){ return currentUser }, setCurrentUser : function(param){ currentUser = param } isAuthenticated : function () { return !!service.currentUser; }, login : ....
}, logout : .... }, requestCurrentUser : ... } }; return service; }]);

现在要看的另一件事是你"刷新"您的应用程序,当您点击刷新时,您可能(取决于浏览器)在本地销毁所有存储的数据,然后您需要在首次加载时从服务器获取它。