配置阶段后配置常量

时间:2013-11-24 15:03:26

标签: angularjs

我有一个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}}例如。

我该怎么做?

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。