config.js
angular.module('config', []).constant('ENV',
{
name: 'My Angular Project',
apiEndPoint: 'http://SOMEIP/myServer', //API host,
adminUrl:'/admin/regionid/site/siteid/admin/regionid', //endpoint
loginUrl:'/login/regionid/site/siteid/device'
});
controller.js
this.userLogin = function(username, password) {
var adminServicePath = ENV.apiEndPoint + ENV.adminUrl
//final url = http://SOMEIP/myServer/admin/1/site/1/admin/1
var loginServicePath = ENV.apiEndPoint + ENV.loginUrl
//final url = http://SOMEIP/myServer/login/2/site/2/device
return $http({
method: 'POST',
url: adminServicePath,
headers: {
"Authorization": "Basic ",
"Content-Type": "application/x-www-form-urlencoded"
}
})
};
这里我将使用端点附加API以形成完整的URL。我的问题是regiondid
,siteid
是动态的。用户登录后,一个REST API请求将获取siteid
和regionid
作为响应。
siteid
和regionid
收到API回复?在收到响应中的id后,调用一个替换该值的函数。答案 0 :(得分:0)
您可以使用String.prototype.replace(substr, newsubstr)
您可以保留regionID
而不是?
var ENV = {
name: 'My Angular Project',
apiEndPoint: 'http://SOMEIP/myServer', //API host,
adminUrl: '/admin/?/site/?/admin/?', //endpoint
loginUrl: '/login/?/site/?/device'
};
var adminServicePath = ENV.apiEndPoint + ENV.adminUrl.replace("?", 1).replace("?", 1).replace("?", 1);
console.log("Final url admin : " + adminServicePath);
var loginServicePath = ENV.apiEndPoint + ENV.loginUrl.replace("?", 2).replace("?", 2);
console.log("Final url login : " + loginServicePath);

答案 1 :(得分:0)
我假设只能从对登录端点的响应中获取siteid
和regionid
。
出于显而易见的原因,使用常量可能不是最好的想法(即它们是常量,并且在您想要创建它们时无法创建)。
相反,你可以做一些事情 - 一个可能适用于很多用例的简单解决方案是创建一个包装API调用的登录服务,然后在服务或其他服务中设置一个值可以注入你需要的任何地方。
可能看起来像这样:
angular.module('app')
.service('loginService', function($http) {
var siteId,
regionId;
function login(username, password) {
return $http({
method: 'POST',
url: '<login endpoint here>',
headers: {
"Authorization": "Basic ",
"Content-Type": "application/x-www-form-urlencoded"
}
})
.then(function(result) {
siteId = result.siteId;
regionId = result.regionId;
});
}
);
这使您在登录后需要进行API调用时可以使用这些值。但是,这不是很好,因为您需要将loginService
注入需要它的任何控制器/服务中,该控制器/服务可能根本不关心登录服务。
一种改进的方法可能是拥有一个API服务来执行http gets / sets / puts / posts /以及数据访问层访问的任何内容。在此服务中,您可以设置/获取siteid
和regionid
。
可能看起来像这样:
angular.module('app')
.service('api', function($http) {
var siteId,
regionId;
var defaultHeaders = {
"Authorization": "Basic ",
"Content-Type": "application/x-www-form-urlencoded"
};
function post(url, options) {
return $http({
method: 'POST',
url: url,
headers: options.headers ? options.headers : defaultHeaders
});
}
// Other functions to perform HTTP verbs...
});
angular.module('app')
.service('loginService', function(api) {
function login(username, password) {
api.post('urlHere', options)
.then(function(result) {
api.siteId = result.siteId;
api.regionId = result.siteId;
});
}
});
然后,您可以访问自己喜欢的siteid
和regionid
。
例如:
angular.module('app')
.controller('someService', function(api) {
function doSomethingWithTheApi() {
var url = 'www.google.com/' + api.siteId + '/' + api.regionId + 'whatever-else';
return api.post(url, {});
}
);
注意:上面的代码并不完整,但是它让您非常了解您可以采取的方法,这种方法相当干净,不太苛刻且易于测试:)
希望有所帮助!
答案 2 :(得分:0)
而不是常数,你可以使用值。
angular.module('config', []).value('ENV',
{
name: 'My Angular Project',
apiEndPoint: '', //API host,
adminUrl:'', //endpoint
loginUrl:''
});
在API调用后注入ENV并设置所有值。
ENV.name = xyz;
ENV.apiEndPoint = xyz;
ENV.adminUrl = xyz;
ENV.loginUrl = xyz;
但刷新浏览器后,这些值可能会设置为默认值。