Лучший способ переопределить значения/константы модуля в angularJS

Я написал модуль в angularJS, который инкапсулирует все серверные коммуникации. Для большей гибкости у меня есть префикс api как постоянное значение модуля (может быть значением, так как я не использую его на этапе конфигурации). что-то вроде

angular.module('myapp.data').constant('apiPrefix', '/api/data');

теперь я хочу использовать этот модуль из двух разных приложений. Один использует /api1 / data, а другой / api2 / data, и я хотел бы изменить это на этапе конфигурации приложения. Я знаю, как это сделать с провайдером, но наличие провайдера для хранения значения кажется мне излишним. Можно ли изменять константы или значения используемых модулей на этапе конфигурации приложения?

что-то типа:

angular.module("data", [])
.value('apiPrefix', '/api/data')
.factory('display', function(apiPrefix){
  return {
    pref: function(){
      console.log(apiPrefix);
      return apiPrefix;
    }
  }
});


angular.module("myApp",['data'])
.config(['apiPrefix', function(prefix){
  prefix = 'https:/api/data'; 
}])
.controller("Example", function($scope, display) {
   $scope.prefix = display.pref;
});

3 ответов


чтобы переопределить значения модуля, можно переопределить угловое значение в последующих модулях. Я считаю,что это не должно быть сделано время конфигурации модуля.

angular.module("data", [])
.value('apiPrefix', '/api/data')
.factory('Display', function(apiPrefix){
  return {
    pref: function(){
      return apiPrefix;
    }
  }
});




angular.module('myapp', ['data'])
  .value('apiPrefix', '/api2/data')
  .controller('MainCtrl', function($scope, Display)    {
      $scope.name = Display.pref();
  });

см. plunker здесь: http://plnkr.co/edit/k806WE

то же самое применимо и для угловых констант.


модуль

angular.module("data", [])
  .constant('apiPrefix', '/api/data');

мы можем переопределить constant полностью, как value.

angular.module('myapp', ['data'])
  .constant('apiPrefix', '/api2/data');

также мы можем переопределить полностью в config

angular.module('myapp', ['data'])
    .config(function ($provide) {
        $provide.constant('apiPrefix', '/api2/data');
    });

также мы можем переопределить полностью или частично (если объект) в run

angular.module('myapp', ['data'])
    .run(function (apiPrefix) {
        apiPrefix = '/api2/data';
    });

но если мы хотим переопределить constant С объектом частично в конфигурации (не в run), мы можем сделать что-то вроде этого

angular.module("module1", [])
    .constant('myConfig', {
        param1: 'value1' ,
        param2: 'value2'
    });

angular.module('myapp', ['data'])
    .config(function ($provide, myConfig) {
        $provide.constant(
            'myConfig', 
            angular.extend(myConfig, {param2: 'value2_1'});
        );
    });

угловые модули, регуляторы, etc. может содержаться в функциях, if-операторах и т. д. Они не должны быть на высшем уровне. Таким образом, вы можете включить это в свой код:

if (environmentOne()) {
  module.value('apiPrefix','api1/data');
} else {
  module.value('apiPrefix','api2/data');
}

надеюсь, что это поможет!