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 모두에 해당되면 모두 잘 작동합니다. 내 질문은 config.yaml이없는 경우 어떻게 $ q.all()이 정상적으로 실패하게합니까??

또한, 전체 컨트롤러를 .then()에 래핑 할 필요가 없도록 구성 파일을 동 기적으로로드하는 방법이 있습니까?

감사합니다. 정상적으로 config.yaml의 비 존재를 처리하기 위해 내가 생각할 수있는

답변

1

한 가지 방법은 다음과 같습니다

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의 빈 객체를 반환하여, 사건을 "존재하지 않는"고정 (또는 아무것도 당신의 필요에 맞는).

config 파일을 동 기적으로로드하는 우아한 방법을 생각할 수 없습니다. ngRoute을 사용하는 경우 경로 앞에 resolve 구성 (more here)을 사용하여 컨트롤러를 시작하기 전에 데이터를 공급할 수 있습니다.

+0

모두 유용합니다. ngRoute를 사용하는 것은 흥미로운 생각이며, 고려하지 않았습니다. 고맙습니다! – aendrew