在我的最新项目中,我正在制作一些API请求。
就我需要设置不同的端点(本地开发,远程生产)而言,我在定义应用时设置了使用的端点的值。一切正常。
var app = angular.module('app', ['lelylan.dashboards.device', 'ngMockE2E'])
app.value('client.config', { endpoint: 'http://localhost:8000' });
唯一的问题是我想从定义一些常量[1]的服务设置端点http://localhost:8000
。我尝试使用run和config块,但未设置该值。我正在做这样的事情,没有任何结果。
var app = angular.module('app', ['lelylan.dashboards.device', 'ngMockE2E'])
.config(function(ENV) {
app.value('lelylan.client.config', { endpoint: ENV.endpoint });
})
这对我来说非常糟糕,但我不知道如何解决这个问题。 非常感谢。
答案 0 :(得分:0)
请参见此处:http://jsbin.com/foqar/1/
var app = angular.module('app', []);
var client = {
endpoint : 'http://localhost:8000'
}
app.value('config', client);
app.controller('firstCtrl', function($scope, config){
$scope.endpoint = config.endpoint;
});
或:http://jsbin.com/foqar/2/edit
var app = angular.module('app', []);
app.value('config',{client :{endpoint : 'http://localhost:8000'}});
app.controller('firstCtrl', function($scope, config){
$scope.endpoint = config.client.endpoint;
});
答案 1 :(得分:0)
看起来grunt-ng-constant创建了一个新的模块文件来定义常量。除了将包含这些常量的模块声明为依赖项之外,您不必在应用程序JS文件上烦恼它。
以下内容与documentation of grunt-ng-constant
的示例配置相同grunt.initConfig({
ngconstant: {
options: {
name: 'config',
dest: 'config.js',
constants: {
title: 'grunt-ng-constant',
debug: true
}
},
dev: {
constants: {
title: 'grunt-ng-constant-beta'
}
},
prod: {
constants: {
debug: false
}
},
}
});
在options
部分中,指定模块的名称,要写入的模块的文件以及一组常量。它的工作原理如下,
options: {
name: 'config',
dest: 'config.js',
constants: {
title: 'grunt-ng-constant',
debug: true
}
}
以上代码将成为,
/*File: config.js*/
angular.module('config', [])
.constant('title', 'grunt-ng-constant')
.constant('debug', true);
要根据您的方案(开发/生产)更改常量,您将使用不同的任务集。这是dev
和prod
部分发挥作用的地方
考虑到您正在使用ng-boilerplate,在gruntfile.js中您可以构建和编译任务。构建任务在开发期间使用,编译使您的应用程序准备好进入生产阶段。
在build task
中添加ngconstant:dev
,在compile task
添加ngconstant:prod
。
grunt.registerTask('build', ['clean', 'html2js', 'otherTasksComeHere', 'ngconstant:dev']);
grunt.registerTask('compile', ['clean', 'html2js', 'otherTasksComeHere', 'ngconstant:prod']);
对于您的方案,代码如下:
/*gruntfile.js*/
grunt.initConfig({
ngconstant: {
options: {
name: 'lelylan.client.config',
dest: 'config.js',
values: {
endpoint : 'http://localhost:8000'
}
},
dev: {
debug: true
},
prod: {
endpoint: 'http://www.production-server.com/',
debug: false
}
},
});
grunt.registerTask('build', ["ngconstant:dev"]);
grunt.registerTask('compile', ["ngconstant:prod"]);
grunt.registerTask.('default', ["build", "compile"]);
/*app.js*/
var app = angular.module('app', ['lelylan.dashboards.device', 'leylan.client.config', 'ngMockE2E']);
app.controller("appCtrl", ["$scope", "$http", "endpoint",
function($scope, $http, endpoint) {
$scope.submit = function(formData) {
$http.post(endpoint+'/processform.php', formData);
}
}]);
现在一切都取决于您是运行grunt build
还是grunt compile
。 使用grunt
命令时会运行默认任务。
答案 2 :(得分:0)
解决方案是使用提供商。正如文档所述:
在应用程序引导期间,在Angular关闭之前创建所有 服务,它配置和实例化所有提供者。我们称之为 应用程序生命周期的配置阶段。在这 阶段服务无法访问,因为它们尚未创建 爱好。
出于这个原因,我创建了一个提供程序来设置所需的配置。
<script>
angular.module('app', ['lelylan.dashboards.device'])
angular.module('app').config(function(lelylanClientConfigProvider, ENV) {
lelylanClientConfigProvider.configure({ endpoint: ENV.endpoint });
});
</script>
通过这种方式,所有服务都可以使用新端点。使用.value
这是不可能的。
感谢大家的帮助。