angularjs / javascript 如何更新工厂创建的单例

angularjs / javascript how to update factory created singleton

我对 angularjs 和 javascript 还很陌生,所以我希望你能帮我解决这个问题。我有一个创建服务单例的工厂,我希望它订阅一些事件并在这些事件发生时自行更新。

但是,我不确定如何在此上下文中获取对工厂创建的对象的引用。请参阅代码注释中的 "My Problem"。

我也非常感谢任何关于我使用方式的反馈 angular/js 以及我可以做得更好的地方。

(function () {
'use strict';
var coreMod = angular.module('CoreMod',['ng']);

coreMod.factory('accountService', accountService);
accountService.$inject=['$rootScope',
                        '$log',
                        '$http',
                        '$q',
                        '$localStorage',
                        '$sessionStorage',
                        'authService'];
function accountService($rootScope, $log, $http, $q, $localStorage, $sessionStorage, authService) {
    var accountService = {            
        CurrentAccount: null,
        logOut: logOut,
        _logIn: userLoggedIn//anyway to hide this?
    };
    $rootScope.$on('userLoggedIn', accountService._logIn);
    return accountService;    

    function userLoggedIn() {            
        $http({ method: 'get', url: msApiUrl + '/account/userinfo', timeout: 3000, warningAfter: 50 })//TODO: find a way to make these timinings default
            .success(function (result) {
            $log.info('User logs into api server successfully and gets response: ' + result);
            handleLoginMessage(result);
        }).error(function (result) {
            $log.warn('Error logging into api server. Response: ' + result);
            $rootScope.$broadcast('CriticalError', 'Error logging into api. Please clear your cache and try again. If this occurrs again please contact your system administrator. ');//TODO: configurable and localized message
        });
    };

    function handleLoginMessage(message) {
        var accountService = this; //my problem: this is undefined
        accountService.CurrentAccount={};
        accountService.CurrentAccount.emailHash = message.EmailHash;//TODO: are these case sensitive / can I control that
        accountService.CurrentAccount.organizationId = message.OrganizationId;
        accountService.CurrentAccount.username = message.Username;
        $localStorage.userInfo = accountService;
    };

    function logOut() {
        authService.logOut();
        $sessionStorage.$reset();
        $localStorage.userInfo = null;                     
    };
}

}());

您根本不需要代码行。只需删除:

var accountService = this;

accountService 是您使用 var accountService = {...} 创建的对象文字,您的函数 handleLoginMessage 在同一范围内。因此 accountService 变量应该可以在 handleLoginMessage.

中访问

如果您想隐藏 _logIn: userLoggedIn,则将其从 accountService 对象中删除,但这样就无法从您的服务外部访问它。 accountService 中的所有内容都会暴露给正在注入您的工厂的其他控制器、服务或工厂。