我想在加载应用程序的第一页之前解决一些问题,但它一直告诉我
未知提供者: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;
})
}
答案 0 :(得分:2)
我要说,我们必须区分UI-Router
状态世界和角度本身。这里明确定义了原因(从$resolve中提取UI-Router API documentation):
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;
}])
中查看