在项目启动时从$ http.GET设置Angularjs常量

时间:2016-03-17 15:05:20

标签: javascript angularjs json

在我的应用程序中,我有一个编排服务,可以从注册它的不同服务中获取uris。 service_1service_2可能位于不同的计算机上,但只有一个已注册,其机器的uris将被存储。

在我使用该编排服务的其他应用程序中,我想调用编排服务来获取uris,但是我想将它们设置为Angular常量,或者至少能够使用uri的值。

所以这就是使用'常量'的服务,这是从业务流程服务中提取的uri:

(function () {
    'use strict';

    angular
        .module('data.model-view', ['restapi'])
        .factory('MVService', MVService);

    MVService.$inject = ['$http', '$q', 'exception', 'logger', 'restapi'];
    /* @ngInject */
    function MVService($http, $q, exception, logger, restapi) {

        var HOST = restapi.mvservice.HOST;
        var MODULE = restapi.mvservice.MODULE;
    ...
    //below is an example of what will use the above host/module in order to 
    //get the data needed for this application

    function getModels() {
        return $http.get(HOST + MODULE + '/model/retrieveAll')
            .then(success)
            .catch(fail);

        function success(response) {
            return response.data;
        }
        function fail(e) {
            return exception.catcher('XHR Failed for retrieveAll')(e);
        }
    }

那么这是restapi模块,我希望设置常量,所以我可以在整个应用程序中访问它们,但我需要先从业务流程服务中获取它们。

(function() {
    'use strict';
    var data = '';
    angular
        .module('restapi', [])
        .factory('restapi', function($http, exception) {
            var HOST = %%ORCSERVICE%%;
            var MODULE = '/orchestration/service/rest/data';

            return $http.get(HOST + MODULE)
            .then(success)
            .catch(fail);

            function success(response) {
                //so at this point I can actually access the data I need
                //with a console.debug(response.data);
                return response.data;
            }

            function fail(e) {
                return exception.catcher('XHR Failed to reach orc')(e);
            }
        }).constant('restapi', constant());

    function constant() {
        //set constants here based on the data pulled from above

       //ideally I want the result of this to be like
       //{
       //    mvservice: {
       //        'HOST': 'http://xxxxxxxxxx.amazonaws.com'
       //        'MODULE': '/rest/service/whatever'
       //    },
       //    ... //other service here
       //}
    }

})();

就像我在上面的评论中所说,我实际上可以从上面的$http.get获得我需要的数据(uris)。我当时希望能够将数据集作为常量,或者至少以我可以访问它的形式。因为当MVService旋转时,它需要来自业务流程服务的自己的uir才能进行其余的调用。抱歉可能有点混乱,如果需要澄清,请告诉我。

2 个答案:

答案 0 :(得分:5)

获取必要数据后尝试引导应用程序:

var injector = angular.injector(['ng']),
    http = injector.get('$http');

http.get(HOST + MODULE).then(function (result) {
    app.value('restapi', result.data);
    angular.bootstrap(document, [app.name]);
});

答案 1 :(得分:0)

有多种方式:

如果你想使用angular.constant,你可以通过延迟使用angular的bootstrap来获取url,直到你得到你的值。因为ng-app加载后你不能设置常量。要做到这一点,请参阅karaxuna的回答。

另一种方法是在服务的构造函数中执行角度查询。因为控制器的路由和呼叫不会发生,直到服务的实例化阶段的所有承诺都将得到解决。因此,您可以将请求的结果存储为服务的字段,然后在应用程序的controllers / directives / angular.run部分中无任何竞争问题的情况下访问它。