javascript – 重用没有循环依赖的服务
作者:互联网
我有一个服务全局存储我的应用程序中使用的所有数据.
GlobalDataService(GDS)
angular
.module('app.core')
.service('GlobalDataService', GlobalDataService);
GlobalDataService.$inject = ['$http', 'LineStatusService'];
function GlobalDataService($http, LineStatusService) {
var gds = this;
gds.data = {
//all my data
}
gds.data.lines = LineStatusService.getLineStatus().then...
}
还有一个简单的crud服务来处理我的数据状态.
StatusDataService(SDS)
angular
.module('app.core')
.service('LineStatusService', LineStatusService);
LineStatusService.$inject = ['$http', 'GlobalDataService'];
function LineStatusService($http, GlobalDataService) {
var service = {
getLineStatus: getLineStatus,
saveLineStatus: saveLineStatus,
...
};
function saveLineStatus (line, status, user) {
var data = {
status: {
status_id: status.status_id,
status_desc: status.status_desc
},
updated_by: user
}
return $http.post('/api/euauto/v1/delivery-status/linestatus', data)
.then(function successCallback(response) {
GlobalDataService.data[id].status = status;
return response.data;
}).catch(function errorCallback(response) {
});
}
return service;
}
GDS必须在应用程序首次加载时请求所有状态,然后状态服务处理任何其他数据请求.
现在我明白你不能有循环依赖,因此我的计划是让我的Controller使用SDS处理保存和更新,并且还更新GDS.
潜在解决方案
angular
.module('core')
.controller('MyController', MyController);
MyController.$inject = ['GlobalDataService', 'LineStatusService'];
function MyController(GlobalDataService, LineStatusService) {
function changeStatus(line, status, user) {
//do a thing
//and another
LineStatusService.saveLineStatus(line, status, user);
GlobalDataService.data.line[id] = status;
GlobalDataService.updateAllOtherData();
//etc...
}
}
问题
我的问题是,现在我想开发一个新的Controller,其中包含完全相同的功能,我现在必须记住从我原来的Controller复制相同的代码和业务逻辑,以重用两个服务.
此外,如果GDS不依赖于SDS,它将无法加载getLineStatus(),并且应用程序中的每个Controller都必须记住加载时的getLineStatus().
理想情况下,所有逻辑和请求都应包含在一个地方,最好是我的SDS.我的GDS数据应该在整个应用程序中保持一致.
解决方法:
如果应用程序启动时应该使用数据初始化GlobalDataService,那么可以在.run()块而不是服务构造函数中初始化它.这样,GDS根本不需要注入其他服务.然后,其他数据服务可以注入GDS而不会出现循环依赖性问题.
angular
.module('app.core')
.run(function(GlobalDataService, LineStatusService) {
GlobalDataService.data.lines = LineStatusService.getLineStatus().then...
});
标签:javascript,angularjs,dependency-injection,angular-services 来源: https://codeday.me/bug/20190522/1153729.html