是否可以根据配置更改在AngularJS中使用不同的模块?

时间:2014-07-29 16:16:23

标签: javascript angularjs

我理解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提供商只是在实例化之前修改一个现有服务)

这样的事情是否可能?

1 个答案:

答案 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
   }
})

注意:上面的代码并不准确,只是为了给你一个想法。