1

我在项目中使用角度 ui 路由器和教练土豆,我希望从服务器端加载 ui 路由器状态并添加到角度 app.Config 中的状态提供程序,但不能将 $http 服务注入 app.Config 函数,我的代码如下:

var app = angular.module('app', [ 'ui.router.compat']);
app.config(['$stateProvider', '$routeProvider', '$urlRouterProvider', '$http',
  function ($stateProvider, $routeProvider, $urlRouterProvider, $http) {

      $urlRouterProvider
        .when('/c?id', '/contacts/:id')
        .otherwise('/');

      $routeProvider
        .when('/user/:id', {
            redirectTo: '/contacts/:id'
        });

      var get = $http.get('/api/Values/');

      get.success(function (data) {
            list = data.result;
        });

      var populateStates = function () {

          angular.forEach(list, function(item) {
              $stateProvider.state(item);

              angular.forEach(item.subMenus, function(sub) {
                  $stateProvider.state(sub);
              });
          });
      };

      populateStates();
  }]);

如何在 app.Config 中从服务器获取数据(状态)

4

1 回答 1

0

底线是:

  • 您不能将服务注入提供程序配置部分。
  • 您可以将服务注入到初始化提供者服务的部分。

细节:

Angular 框架有两个阶段的初始化过程:

阶段 1:配置

在这个config阶段,所有的提供者都被初始化并且所有的config部分都被执行。这些config部分可能包含配置提供程序对象的代码,因此可以将它们注入提供程序对象。但是,由于提供者是服务对象的工厂,并且在此阶段提供者尚未完全初始化/配置 -> 在此阶段您不能要求提供者为您创建服务 -> 在配置阶段您不能使用/注入服务。此阶段完成后,所有提供程序都准备就绪(配置阶段完成后无法再进行提供程序配置)。

第 2 阶段:运行

run阶段期间,所有run部分都被执行。在此阶段,提供者已准备好并可以创建服务 -> 在运行阶段您可以使用/注入服务。

例子:

1. 将 $http 服务注入提供者初始化函数将不起作用

angular.module('myModule').provider('myProvider', function($http) {
    // SECTION 1: code to initialize/configure the PROVIDER goes here (executed during `config` phase)
    ...

    this.$get = function() {
        // code to initialize/configure the SERVICE goes here (executed during `run` stage)

        return myService;
    };
});

由于我们试图将$http服务注入到在该config阶段执行的函数中,我们将得到一个错误:

Uncaught Error: Unknown provider: $http from services 

这个错误实际上是在说$httpProvider用于创建$http服务的那个还没有准备好(因为我们仍处于config阶段)。

2. 将 $http 服务注入服务初始化函数将起作用:

angular.module('myModule').provider('myProvider', function() {
    // SECTION 1: code to initialize/configure the PROVIDER goes here (executed during `config` phase)
    ...

    this.$get = function($http) {
        // code to initialize/configure the SERVICE goes here (executed during `run` stage)

        return myService;
    };
});

由于我们现在将服务注入到服务初始化函数中,该函数在run阶段执行,因此该代码将起作用。

注意:这是从这里无耻地复制的

于 2013-09-29T13:16:07.223 回答