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

angularjs/javascript如何更新工厂创建的单例,javascript,angularjs,angularjs-factory,Javascript,Angularjs,Angularjs Factory,我对angularjs和javascript非常陌生,所以我希望你能帮我解决这个问题。我有一个创建服务单例的工厂,我希望它订阅一些事件,并在这些事件发生时进行自我更新 但是,我不知道如何在这个上下文中获得对工厂创建的对象的引用。在代码注释中查看我的问题 我也非常感谢所有关于我使用angular/js的方式以及我可以做得更好的反馈 (function () { 'use strict'; var coreMod = angular.module('CoreMod',['ng']); coreMo

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

但是,我不知道如何在这个上下文中获得对工厂创建的对象的引用。在代码注释中查看我的问题

我也非常感谢所有关于我使用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变量应该可以通过in-handleLoginMessage访问


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

您的问题是什么?它是如何隐藏登录的?是否使用var accountService=this;进行了未定义?您在哪里对accountService进行console.log以查看它是否未定义?请看看这个。我已经删除了http以模拟您的服务,而没有后端;其他的一些改变肯定已经解决了这个问题,并使我的解决方案解决了这个问题。谢谢你的帮助。