是否有可能在AngularJS中使用基于配置更改的不同模块?

Is it possible to use a different modules in AngularJS based on a config change?

本文关键字:配置 模块 AngularJS 有可能 于配置 是否      更新时间:2023-09-26

我有点理解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
          }
      };
  } ])
;

在我的angular控制器中,我可以注入myDataServiceLocalStorage或myDataServiceWebService来访问getOrders函数,但我如何才能更好地配置它,以便在所有控制器中使用其中一个或另一个?

我不一定需要它来自动检测环境,但是有没有一种方法可以做到这一点,这样我就不必在每次准备部署项目时全局搜索和替换每个模块引用?

我在考虑做一些关于提供商的事情,但我很困惑,我不认为这是他们的主要目的(看起来Angular提供商只是在实例化之前修改一个现有的服务)

这样的事情可能吗?

我有一个类似的需求,我所做的是为每个设备创建单独的工厂。

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

注意:上面的代码是不精确的,它只是给你一个想法。