如何在AngularJS中动态注入整个模块?

时间:2014-05-29 18:52:39

标签: javascript angularjs angular-mock

好吧,所以我正在尝试设置$ httpBackend以用作针对API的本地开发的模拟服务器。我在单独的模块中有两个服务:search和searchMock:

  • search返回一个$ resource对象,该对象在暂存或生产环境中公开API动词,并按预期工作
  • searchMock公开了$ httpBackend,而httpBackend又使用模拟JSON对象进行响应,并按其预期的方式工作

我有另一个服务APIInjector,它根据构建应用程序时由Grunt动态包含的配置文件来确定当前环境是什么,并相应地注入搜索或搜索模式。

我的问题是,据我所知,从搜索高低,$ httpBackend需要在模块的run方法中设置。这个问题是我无法在APIInjector的条件逻辑中注入run方法。

如果满足开发环境条件,我如何公开$ httpBackend,否则我的$ resource服务会公开?请注意,我没有包含调用控制器或searchService的代码,但如果需要我可以澄清。

searchMock:

var searchMockService = angular.module('searchMockService', []);

searchMockService.run([
  '$httpBackend', 
  function($httpBackend) {
    results = [{name: 'John'}, {name: 'Jane'}];
    $httpBackend.whenGET('/search').respond(results);
}]);

APIInjector:

var APIInjectorService = angular.module('APIInjectorService', [
  'searchService', 
  'searchMockService'
]);

APIInjectorService.factory('APIInjector', [
  '$injector',
  'ENV_CONF',
  function($injector, ENV_CONF) {
    var isDevelopment = ENV_CONF.IS_DEVELOPMENT;

    // Check to see if we're in dev and, if so, inject the local API services
    if (isDevelopment) {
      return {
        Search: // Not sure what to do here to expose searchMock's run method???
      };
    } else {
      return {
        Search: $injector.get('Search') // This returns $resource from the search service, as expected
    };
  }
}]);

2 个答案:

答案 0 :(得分:1)

为了对这个问题提出最后一点,我最终将其解决了我的构建脚本(Grunt)并完全放弃了上述方法。相反,我将要构建的环境(开发,登台,生产等)作为Grunt的标志传递,然后在构建期间加载适当的API服务。

希望能帮助其他人尝试实施无后续开发!

答案 1 :(得分:0)

如果你没有使用requirejs,那么我会使用document.write方法,因为它看起来很糟糕(它不应该是requirejs的问题)。

  • 1 - 在脚本标记中引导您的ENV_CONF变量作为HEAD标记中的第一个脚本。
  • 2 - 加载所有常用脚本
  • 3 - 在另一个SCRIPT标签中测试ENV_CONF.IS_DEVELOPMENT。
  • 4 - 如果为真document.write('<script src="angular-mocks.js"></script><script src="main-dev-module.js"></script>')
  • 5 - 如果错误document.write('<script src="main-prod-module.js"></script>')
  • 6 - 利润

这样你就不需要在你的模块中处理ENV_CONF.IS_DEVELOPMENT了。

html5样板文件使用此技术从cdn或本地

获取jquery

https://github.com/h5bp/html5-boilerplate/blob/master/index.html

编辑:我确信有更简洁的方法可以在angularjs中动态注入服务,但这就是我要做的事情。我希望有人提出更好的选择。