我理解DI如何与AngularJS中的模块一起工作,我希望利用它来根据应用程序的环境使用不同的模块。
例如,我想制作可在移动设备(使用Phonegap)和常规桌面浏览器上运行的内容。
我想用于数据访问的服务功能。在设备上,我只是想让它查询设备上的本地数据库。对于桌面浏览器版本,我希望它能够查询Web服务。
例如,我想要两个可以互换的服务:
angular.module('myDataServiceLocalStorage', [])
.factory('dataSrv', [function () {
return {
getOrders: function () {
//get from database
}
};
} ])
;
angular.module('myDataServiceWebService', [])
.factory('dataSrv', [function () {
return {
getOrders: function () {
//get from web service
}
};
} ])
;
在我的角度控制器中,我可以注入myDataServiceLocalStorage或myDataServiceWebService来访问getOrders
函数,但是如何更好地配置它以使用我的所有控制器中的一个?
我不一定需要它来自动检测环境,但有一种方法可以做到这一点,这样我每次准备部署时都不必全局搜索和替换每个模块参考项目
我正在考虑与提供商做一些事情,但我很困惑,我不认为这是他们的主要目的(看起来Angular提供商只是在实例化之前修改一个现有服务)
这样的事情是否可能?
答案 0 :(得分:1)
我有类似的要求,我所做的是每个设备为每个设备创建单独的工厂。
app.factory("deviceOneFactory", function(){
var renderOne = function(params) {
// logic for rendering typeOneChart
};
return {
render : renderOne
}
})
app.factory("deviceTwoFactory", function(){
var renderTwo = function(params) {
// logic for rendering typeTwoChart
};
return {
render : renderTwo
}
})
所以你有上面的工厂,返回相同的函数名称,所以它实现了一个接口。
然后有一个父工厂,它使本部分的应用程序的其他部分不可知
app.factory("deviceFactory", function(){
var localFactory ;
var deviceFactory = function(){
switch(devicetype) {
case 'one':
localFactory = typeOneDevice;
break;
case 'two':
localFactory = typeTwoDetive;
break;
default:
throw exception("invalid device type : " + deviceType);
}
}
var render = function(params) {
localFactory.render();
};
return {
render : render
}
})
注意:上面的代码并不准确,只是为了给你一个想法。