AngularJS:如何将服务注入工厂

时间:2014-07-29 03:15:02

标签: angularjs promise factory angular-resource

我有一个REST后端,它提供了API方法的散列图。这允许前端使用键名映射到API方法,而不需要知道整个REST URL。

例如:

{
  CHARGE.GET_CHARGE_INFO: /provider/charge/getChargeInfo/{{providerId}}/{{chargeId}}
  CHARGE.LIST_CHARGES: /provider/charge/listCharges/{{providerId}}
  CHARGE.LIST_TYPES: /provider/charge/listTypes
}

有一项服务负责从REST API加载hashmap。

app.service('preloader', function ($http, globals, $interpolate, $q) {
    var self = this;
    var endPointsList = $http.get(globals.apiPath + globals.endPointsPath, {}).success(function (data) {
        self.endPoints = data;
    });

    return {
        endPointsList: endPointsList,
        getResourceEndPoint: function( endPoint ){
            if (!self.endPoints[endPoint]) {
                // To avoid misleading errors
                throw ("Endpoint not found. \r\nEndpoint: " + endPoint + "\r\nFound: " + self.endPoints[endPoint]);
            }
            // reformat
            return globals.apiPath + self.endPoints[endPoint].replace(/{{([^}]+)}}/g, ":$1");
        }
};

我试图编写一个使用此服务的$resource,但问题是当服务注入工厂时,它尚未初始化,因此调用该方法来检索端点抛出错误。

app.factory('providerFactory', ['$resource', 'preloader',

    function ($resource, preloader) {
        return $resource( "", null,
            {
                "getTypes" : {
                    method: 'GET',
                    url: preloader.getResourceEndPoint('PROVIDER.LIST_TYPES')
                },

                "get": {
                    method: 'GET',
                    url: preloader.getResourceEndPoint('PROVIDER.GET_PROVIDER_INFO'),
                    params: {
                        providerId: '@providerId'
                    }
                }
            }
        );
});

错误消息:

TypeError: Cannot read property 'PROVIDER.LIST_TYPES' of undefined
    at Object.getResourceEndPoint (http://localhost:8888/client.git/build/app.min.js:3:8967)

如果我单步执行代码,我会看到工厂的preloader.getResourceEndPoint()调用在服务完成endPointsList的初始化之前调用服务。

我该怎么做才能避免这个问题?我必须使用$q承诺吗?这样的事情似乎有些过分。如果是这样,我不得不怀疑这是否是正确的方法来使这样的东西工作,但我不知道使用什么方法。

我还在学习AngularJS,所以我并不完全确定正确的方法。我继承了这段代码,所以如果它看起来很复杂/没有任何复杂性,我会很高兴看到如何改进它。

0 个答案:

没有答案
相关问题