Nic*_*ick 5 javascript dependency-injection angularjs angular-services
我有一个服务全局存储我的应用程序中使用的所有数据.
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...
}
Run Code Online (Sandbox Code Playgroud)
还有一个简单的crud服务来处理我的数据状态.
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;
}
Run Code Online (Sandbox Code Playgroud)
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...
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,现在我想开发一个新的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...
});
Run Code Online (Sandbox Code Playgroud)