Лучший способ переопределить значения/константы модуля в 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');
}
надеюсь, что это поможет!