另一種方式則可以解決這使用供應商並將其配置在配置階段。
這是一個類似的例子,我做了一段時間後。
.provider('Environment', function() {
var environments = {
dev: {
root: 'http://localhost',
port: 3000,
api: '/api',
version: 'v1'
}
};
var selectedEnv = 'dev';
var self = this;
this.setEnvironments = function (envs) {
if (!Object.keys(envs).length)
throw new Error('At least one environment is required!');
environments = envs;
};
this.setActive = function (env) {
if (!environments[env])
throw new Error('No such environment present: ' + env);
selectedEnv = env;
return self.getActive();
};
this.getEnvironment = function (env) {
if (!env)
throw new Error('No such environment present: ' + env);
return environments[env];
};
this.getActive = function() {
if (!selectedEnv)
throw new Error('You must configure at least one environment');
return environments[selectedEnv];
};
this.getApiRoute = function() {
var active = self.getActive();
return active.root + (active.port ? ':' + active.port : '') +
active.api + (active.version ? '/' + active.version : '');
};
this.$get = [function() {
return self;
}];
})
然後在配置階段:
.config(function (EnvironmentProvider) {
EnvironmentProvider.setEnvironments({
dev: {
root: 'http://10.0.0.3',
api: '/api',
version: 'v1'
},
localonly: {
root: 'http://localhost',
api: '/api',
version: 'v1'
},
prod: {
root: 'https://myapp.mybackend.com',
api: '/api',
version: 'v1'
}
});
//Set prod as the active schema
EnvironmentProvider.setActive('prod');
});
在某些控制器/服務/工廠後來:
.factory('API',function($resource, Environment){
return {
User: $resource(Environment.getApiRoute() + '/users/:id', {id: '@_id'}),
OtherResource: $resource(Environment.getApiRoute() + '/otherresource/:id', {id: '@_id'})
}
});
爲什麼你連基本URL改變? –
這是支持多種環境的戰術解決方案。即,如果我需要調試某些東西,我可以輕鬆地將實例指向臨時API。不理想,我正在尋找更長期的解決方案。 –
您可以嘗試將http://部分嵌入到第一個參數中,並從config.baseURL()傳遞該部分的其餘部分並查看它是否有效。 – Chandermani