我在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;
});
答案 0 :(得分:12)
要覆盖模块值,您可以在以后的模块中重新定义角度值。我相信它不应该是模块配置时间。
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
同样适用于角度常数。
答案 1 :(得分:8)
我们的模块
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
部分对象(不在运行中),我们可以做这样的事情
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'});
);
});
答案 2 :(得分:1)
角度模块,控制器等可以包含在函数,if语句等中。它们不必位于顶层。因此,您可以在代码中包含此内容:
if (environmentOne()) {
module.value('apiPrefix','api1/data');
} else {
module.value('apiPrefix','api2/data');
}
希望有所帮助!