下面是一个在引导应用程序之前加载配置文件的示例。
对 bootstrap 的第一次调用是为了获得对 $http 和 $location 等角度服务的访问权限(此时您也可以注入自己的模块来访问自定义服务)。
加载配置文件后,为主应用程序调用 angular.bootstrap,并将加载的配置设置为注入的临时模块(rsacAppBootstrap)上的常量。
与使用运行块中的承诺集相比,这里至少有两个优点:
- 减少所有依赖于配置的承诺样板
- 能够使用 RequireJS 根据环境有条件地加载依赖项
自定义引导脚本:
angular.bootstrap().invoke(function ($http, $location) {
var env = $location.search()._env || null;
if (env === true) {
env = null;
}
var configUri = 'config/env.json';
if (env) {
configUri = configUri.replace('json', env + '.json');
}
var rsacAppBootstrap = angular.module('rsacAppBootstrap', [])
.run(function ($rootScope, $location, $window) {
var env = $location.search()._env;
$rootScope.$on('$locationChangeSuccess', function () {
var newEnv = $location.search()._env;
if (env !== newEnv) {
$window.location.reload();
}
})
});
function bootstrap(config) {
rsacAppBootstrap.constant('rsacConfig', config || {});
angular.element(document).ready(function () {
var modules = ['rsacApp', 'rsacAppBootstrap'];
if (config.modules){
config.modules.forEach(function(v){
modules.push(v);
})
}
angular.bootstrap(document, modules);
});
}
$http.get(configUri)
.success(function (config) {
config._env = env;
if (config.require) {
require(config.require, function(){
bootstrap(config);
});
} else {
bootstrap(config);
}
})
.error(function () {
bootstrap();
});
});
示例配置文件:
{
"_meta": [
"Development environment settings"
],
"require":[
"//code.angularjs.org/1.2.3/angular-mocks.js",
"components/rsacMock/js/rsacMock.js"
],
"modules":[
"ngMockE2E",
"rsacMock"
],
"resources": { ... }
}