我正在使用一个基于angularJS的工具来构建图表,并希望创建一个用户可覆盖的配置系统—即,从一个配置文件加载默认值,如果存在另一个配置文件,则将覆盖默认值。
这是我到目前为止的内容:
angular.module('axisJSApp')
.provider('configProvider', function () {
this.$get = function axisJSConfig($http, $q) {
var defaultConfig = $http.get('default.config.yaml');
var userConfig = $http.get('config.yaml');
return $q.all([defaultConfig, userConfig]).then(function(values){
var defaultConfigYaml = jsyaml.safeLoad(values[0].data);
var userConfigYaml = jsyaml.safeLoad(values[1].data);
return angular.extend(defaultConfigYaml, userConfigYaml);
});
};
});
然后在我的控制器中:
angular.module('axisJSApp')
.controller('MainCtrl', function (configProvider, $scope) {
configProvider.then(function(appConfig){
console.dir(appConfig); // Config loaded, everything else happens.
});
});
如果default.config.yaml和config.yaml同时存在,则所有这些都可以正常工作。我的问题是,如果config.yaml
不存在,如何使$ q.all()正常失败?
另外,是否有任何方法可以同步加载配置文件,所以我不必将整个控制器包装在.then()
?中。
谢谢!
我可以想到的一种config.yaml
优雅解决不存在的方法是:
var userConfig = $http.get('config.yaml').then(
function(response) {
return response.data;
},
function(response) {
if( response.status === 404 ) {
response.data = {};
return response;
}
else {
return $q.reject(response);
}
}
);
return $q.all([defaultConfig, userConfig]).... // AS BEFORE
因此,您可以通过返回一个空对象response.data
(或任何满足您需求的对象)来手动修复“不存在”的情况。
我想不出一种优雅的方式来同步加载配置文件。如果使用ngRoute
,则可以使用resolve
路由配置(在此处更多信息)在启动之前向控制器提供数据。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句