Tengo una aplicación que heredé que debo admitir. Hasta ahora solo se había ejecutado en un servidor y queremos ejecutarlo en diferentes servidores. Encontramos referencias codificadas al nombre del servidor por todas partes en el código del servidor python y el código del cliente C ++. Fue bastante fácil cambiarlos para leer el nombre del servidor desde un archivo de configuración. Pero ahora encuentro que es un módulo js este código:

angular.module('app.config', []).constant('config', {"api":"http://foo.bar.com:8001/"});

¿Cómo puedo cambiar esto para que el valor del servidor se lea dinámicamente desde un archivo de configuración o algún otro medio que no requiera que esté codificado?

Aquí hay una actualización con lo que he intentado:

Originalmente, mi código tenía esto:

angular.module('app.config', []).constant(
  'config', {"api":"http://foo.bar.com:8001/"}
);

Y lo cambié a esto:

angular.module('app.config').controller('myCtrl', 
  function($scope, $http) { 
    $http.get('./config.json') 
      .then(function(response) { 
        $scope.api = response.data; 
    }); 
});

Y obtuve esto:

error Module 'app.config' is not available!

Luego lo cambié a:

angular.module('app.config', [] ).controller('myCtrl', 
  function($scope, $http) { 
    $http.get('./config.json') 
      .then(function(response) { 
        $scope.api = response.data; 
      }); 
});

Y luego obtengo:

Error: [$injector:unpr] Unknown provider: configProvider <- config <- workitem

Siento que estoy muy cerca, solo necesito un poco más de ayuda.

Otra actualización:

Intenté esto:

angular.module('app').controller('home', ['$scope', homeCtrl]);
angular.module('app').controller('workitem', ['$scope', '$routeParams', '$sce', '$timeout', '$http', 'config', workitemCtrl]);
},{"./home/home.js":3,"./workitem/workitem.js":4,"angular":10,"angular-route":6,"angular-sanitize":8,"bootstrap-treeview/src/js/bootstrap-treeview.js":11}],2:[function(require,module,exports){
  module.exports = function($scope,$http) {
      $http.get('config.json').success(function(reponse) {
          console.log("reponse --> "+reponse.api);
          $scope.api = reponse.api;
      });
  }

Pero, por supuesto, app.config no se estaba definiendo. ¿Cómo podría hacer esto y todavía definir app.config?

Acabo de intentar esto:

var my_config = {};

$.getJSON("config.json", function(data) {
  $.each(data, function(key, val) {
    my_config[key] = val;
  });
});

Pero obtengo my_config no está definido cuando lo uso en el controlador. ¿Cómo puedo hacer que esa variable esté disponible en el controlador?

2
Larry Martell 9 may. 2016 a las 16:56

3 respuestas

La mejor respuesta

Finalmente pude hacer que esto funcionara haciendo esto por adelantado:

angular.module('app').value('config', {
  api: ''
});

angular.module('app').run(function($rootScope, $http, config) {
  $http.get('config/config.json').then(function(response) {
        config.api = response.data.api;
        $rootScope.$broadcast('config-loaded');
    });
});

Envolviendo el código principal en:

var init = function(){
}

Y agregando esto al final:

if (config.api) {
  init()
} else {
    var configLoaded = scope.$on('config-loaded', function() {
        init();
        configLoaded();
    });
}
0
Larry Martell 13 may. 2016 a las 09:43

Cree un servicio para leer la configuración (archivo json) o realice una llamada al servidor y almacene la URL de respuesta en LocalStorage de la siguiente manera. Puedes acceder desde cualquier lugar

$ localStorage.api = response.Url; // http://foo.bar.com:8001/

0
Kumar Garapati 9 may. 2016 a las 14:10

Pruebe Esto

angular.module('app.config', [])
.constant('bbConfig',{ 
     "api":"http://foo.bar.com:8001/"
 });

En el controlador

angular.module('app.config', [])
.controller('MainCtrl',['$scope', 'bbConfig' , function ($scope, bbConfig){
    console.log(bbConfig.api)
}]);
3
byteC0de 9 may. 2016 a las 14:10