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
中的所有内容都会暴露给正在注入您的工厂的其他控制器、服务或工厂。
我对 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
中的所有内容都会暴露给正在注入您的工厂的其他控制器、服务或工厂。