Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在AngularJS中创建用户可重写的配置系统_Angularjs_Angular Promise_Angular Services_Angular Http - Fatal编程技术网

在AngularJS中创建用户可重写的配置系统

在AngularJS中创建用户可重写的配置系统,angularjs,angular-promise,angular-services,angular-http,Angularjs,Angular Promise,Angular Services,Angular Http,我正在开发一个基于angularJS的工具来构建图表,我想创建一个用户可重写的配置系统——也就是说,默认值从一个配置文件加载,如果存在另一个配置文件,则会被重写 以下是我目前掌握的情况: angular.module('axisJSApp') .provider('configProvider', function () { this.$get = function axisJSConfig($http, $q) { var defaultConfig = $http.g

我正在开发一个基于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()优雅地失败

此外,是否有任何方法可以同步加载配置文件,这样我就不必将整个控制器包装在
中。然后()


谢谢

我能想到的一种优雅处理
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
配置在控制器启动之前向其提供数据。

这非常有用。使用ngRoute是一个有趣的想法,我没有考虑到这一点。非常感谢。