ui-router resolve不能与索引页面控制器一起使用

时间:2015-03-16 23:47:35

标签: angularjs angular-ui-router

我想在加载应用程序的第一页之前解决一些问题,但它一直告诉我

未知提供者:programClassSummaryProvider< - programClassSummary< - HomeCtrl

我很确定我做得对,因为我为任何其他控制器和路由做了同样的事情。但它不适用于我的主页控制器。 在路由中解析之前,它似乎首先加载控制器。我的代码出了什么问题?

在routing.js

$stateProvider
        .state('home', {
          url: '/home',
          controller: 'HomeCtrl',
          controllerAs: 'vm',
          templateUrl: 'index_main.html',
          resolve: {
            programClassSummary: ['GroupDataFactory', function (groupDf) {
              return groupDf.getProgramClassSummary();
            }]
          },
          ncyBreadcrumb: {
            skip: true
          }
        });

在controller.js

angular
    .module('issMccApp')
    .controller('HomeCtrl', homeCtrl);

  homeCtrl.$inject = ['$scope', '$location', '$state', '$auth', 'programClassSummary'];

  /* @ngInject */
  function homeCtrl($scope, $location, $state, $auth, programClassSummary) {

    var vm = this;

    vm.isAuthenticated = isAuthenticated;
    vm.programClassSummary = programClassSummary;

    if (!$auth.isAuthenticated()) {
      $state.go('login');
      return;
    }

    function isAuthenticated() {
      return $auth.isAuthenticated();
    }
  }

in factory.js

 function getProgramClassSummary(showAll) {
      var query = "";
      if (showAll)
        query = APIConfigObj.base_url + '/api/group/infor/programclasssummary?all=1';
      else
        query = APIConfigObj.base_url + '/api/group/infor/programclasssummary';

      return $http.get(query)
        .success(function (result) {
          return result;
        })
        .error(function (err) {
          return err;
        })

    }

1 个答案:

答案 0 :(得分:2)

我要说,我们必须区分UI-Router状态世界和角度本身。这里明确定义了原因(从$resolve中提取UI-Router API documentation

$resolve

  

resolve(invocables, locals, parent, self)

     

解析一组invocable。 invocable是一个通过$injector.invoke()调用的函数,可以有任意数量的依赖项。可调参数可以直接返回值,也可以是$q保证。如果返回一个promise,它将被解析,并且将使用结果值。解析invocables的依赖关系(按此优先顺序)

     
      
  • 来自指定的当地人
  •   
  • 来自另一个invocable,它是此$ resolve调用的一部分
  •   
  • 从一个从父调用继承到$ resolve(或递归
  • )的invocable   
  • 来自该父母的任何祖先$ resolve。)
  •   

a wroking plunker,它使用此 index.html

<body ng-controller="RootCtrl">

    a summary for a root:
    <pre>{{summary}}</pre>

    <ul>
      <li><a href="#/home">home</a>
      <li><a href="#/other">other</a>
    </ul>

    <div ui-view=""></div>

所以,这里我们使用一些RootCtrl,它不会通过状态机UI-Router,它是角度基本的东西

根控制器必须定义为

.controller('RootCtrl', ['$scope', 'GroupDataFactory', function ($scope, groupDf) { 
  $scope.summary = groupDf.getProgramClassSummary();
}])

对于州政府,我们可以使用不同的方法,实际上与上面相同(下面的简化版本)

  .state('home', {
      url: "/home",
      templateUrl: 'tpl.home.html',
      resolve: {
          programClassSummary: ['GroupDataFactory', function (groupDf) {
          return groupDf.getProgramClassSummary();
        }]
      },
      controller: 'HomeCtrl',
  })

现在它的控制器可以使用当地人

.controller('HomeCtrl', ['$scope', 'programClassSummary', function ($scope, summary) { 
  $scope.summaryForHome = summary;
}])

action here

中查看