我有一个Angular常量,我需要在app的配置阶段之后配置。
它基本上是一个端点集合,其中一些在应用程序进行一些检查后最终确定。
我目前正在做的是将其中一些作为函数返回,我可以传入更改的部分:(示例代码,而不是生产代码。)
angular.module('...',[]).constant('URL',(function()
{
var apiRoot='.../api/'
return {
books:apiRoot+'books',//No env needed here - Property (good)
cars:function(env){//But needed here - Method (bad, inconsistent)
return env+apiRoot+'/cars';
}
};
}()));
但这样效率相当低,因为我只需要编译一次这个URL,而不是每次都需要它。
URL.books
URL.cars('dev');
我正在考虑将其转换为Angular提供程序并在实例化之前对其进行配置,但我不知道是否可以在配置块之外配置它,因为它太早,因为我没有{ {1}}例如。
我该怎么做?
答案 0 :(得分:2)
您可以为每个条目(书籍,汽车......)使用a promise。当您拥有汽车入口的所有信息(例如env)时,您可以解决承诺。
angular.module('...',[]).constant('URL',(function()
{
var apiRoot='.../api/'
var carsPromise = function() {
var deferred = $q.defer();
getEnv().then(function(env) { // getEnv also returns a promise
deferred.resolve(env+apiRoot+'/cars');
});
return deferred.promise;
}
return {
books: instantlyResolvedPromise(apiRoot+'books'),
cars: carsPromise();
};
}()));
当然,这增加了一些复杂性,因为承诺往往像疾病一样传播,但你最终会得到一致的api。