角配置中的$ http请求 - 有可能吗?

时间:2016-05-22 20:57:18

标签: angularjs express angular-ui-router

我正在尝试在我的publicApp.config中进行$ http调用,以便检索与$ urlMatcherFactoryProvider匹配的可用路由数组。

现在,我正在对它们进行硬编码pageUrls = ['about','contact','another-page'];

但是我的快速API中有一个url,它返回一个可用的URL数组。 api网址为"/page-urls"

是否可以在配置中发出$http.get('/page-urls')请求?我知道在run()内可以使用$ http,但是我需要在通过$ stateProvider进行路由之前的可用URL列表。

(function() {
    'use strict'

    var pageUrls = [];

    var publicApp = angular.module('publicApp', ['ui.router'])

    publicApp.config(['$stateProvider', '$urlRouterProvider', '$urlMatcherFactoryProvider', function($stateProvider, $urlRouterProvider, $urlMatcherFactoryProvider) {

        pageUrls = ['about','contact','another-page'];  

        var urls = pageUrls.join('|');
        var urlMatcher = $urlMatcherFactoryProvider.compile("/{source:(?:" + urls + ")}");


        $stateProvider      
            .state('/', {
                url: '/',
                templateUrl: "views/home/home.view.html",
                controller: "homeCtrl"
            })
            .state('urls', {
                    url: urlMatcher,
                    templateUrl: "views/pages/page.view.html",
                    controller: "pageCtrl"
                });

            $urlRouterProvider.otherwise('/');


    }]);



})();

1 个答案:

答案 0 :(得分:3)

创建一个将$stateProvider作为注射剂的提供者。提供程序将创建一个服务,该服务执行http请求然后注册路由。在运行块中注入服务并启动路由注册。

这样的事情:

var publicApp = angular.module('publicApp', ['ui.router'])

publicApp.provider('routes', function($stateProvider, $urlRouterProvider, $urlMatcherFactoryProvider){
    function registerRoutes(listOfUrls){
        // register routes with $stateProvider
        // angular.forEach(listOfUrls, function(url){
        //     $stateProvider.state...
        // });
    }

    this.$get = function($http){
        return {
            initialize: function(){
                return $http.get('/page-urls').then(function(response){
                    registerRoutes(response.data);
                });
            }
        };
    };
});

publicApp.run(function(routes){
    routes.initialize();
});