好吧,所以我正在尝试设置$ httpBackend以用作针对API的本地开发的模拟服务器。我在单独的模块中有两个服务:search和searchMock:
我有另一个服务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
};
}
}]);
答案 0 :(得分:1)
为了对这个问题提出最后一点,我最终将其解决了我的构建脚本(Grunt)并完全放弃了上述方法。相反,我将要构建的环境(开发,登台,生产等)作为Grunt的标志传递,然后在构建期间加载适当的API服务。
希望能帮助其他人尝试实施无后续开发!
答案 1 :(得分:0)
如果你没有使用requirejs,那么我会使用document.write
方法,因为它看起来很糟糕(它不应该是requirejs的问题)。
document.write('<script src="angular-mocks.js"></script><script src="main-dev-module.js"></script>')
document.write('<script src="main-prod-module.js"></script>')
这样你就不需要在你的模块中处理ENV_CONF.IS_DEVELOPMENT了。
html5样板文件使用此技术从cdn或本地
获取jqueryhttps://github.com/h5bp/html5-boilerplate/blob/master/index.html
编辑:我确信有更简洁的方法可以在angularjs中动态注入服务,但这就是我要做的事情。我希望有人提出更好的选择。