0

Я работаю над инструментом для построения диаграмм на основе angularJS и хочу создать настраиваемую пользователем конфигурационную систему - то есть значения по умолчанию загружаются из одного файла конфигурации, которые затем переопределяется, если существует другой файл конфигурации.Создание настраиваемой пользователем системы конфигурации в 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 существуют. Мой вопрос: Как заставить $ q.all() терпеть неудачу изящно, если config.yaml не существует?

Кроме того, есть ли способ синхронной загрузки конфигурационного файла, поэтому мне не нужно обертывать весь контроллер в .then()?

Спасибо!

ответ

1

Один из способов я могу думать, чтобы справиться с несуществование 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 для маршрута (больше here), чтобы доставить контроллер до того, как он начнется.

+0

Это все очень полезно. Использование ngRoute - интересная идея, не считала это. Спасибо! – aendrew

Смежные вопросы