我有两条决心路线。是这样的:
.when('/foos', {
templateUrl: 'views/foos.html',
controller: 'FoosCtrl',
resolve: {
foo_list: ['$q', '$route', '$timeout', '$location', 'Foos', function($q, $route, $timeout, $location, Foos) {
// postpone the execution
var deferred_foo = $q.defer()
Foos.getFoos({token:session_uid}, successCb)
function successCb(list) {
if(list['status'] === 200) {
deferred_foo.resolve(list)
}
else {
alert('Crashcrashcrash')
deferred_foo.reject("Something just wasn't right")
//$location.path('maintenance')
}
}
return deferred_foo.promise
}]
}
})
.when('/r/:type/:bar_id', {
templateUrl: 'views/bar.html',
controller: 'BarsCtrl',
resolve: {
bar: ['$q', '$route', '$timeout', '$location', 'Bars', function($q, $route, $timeout, $location, Bars) {
// postpone the execution
var deferred = $q.defer()
Bars.getBar({type: bar_type}, successCb)
function successCb(result) {
if(result['status'] === 200) {
deferred.resolve(result)
}
else {
alert('Crashcrashcrash')
deferred.reject("Something just wasn't right")
$location.path('foos')
}
return deferred.promise
}]
}
})
然后我有两个控制器像这样工作:
App.controller('FoosCtrl', ['$scope', '$location', 'Foos', 'foo_list', function($scope, $location, Foos, foo_list) {...}
App.controller('BarsCtrl', ['$scope', '$routeParams', '$location', 'Bars', 'bar', 'sharedService', function($scope, $routeParams, $location, Bars, bar, sharedService) {...}
有人可以解释为什么Bar有效,但Foo给了我Error: Unknown provider: foo_listProvider <- foo_list
?我尝试用不同的名字替换foo_list
,以防camelCasing做了一些但没有帮助。
答案 0 :(得分:177)
所以,这个问题与我自己的问题非常相似,我刚刚在Angular IRC频道的人们的帮助下找到了......你是不是偶然设置了你的控制器ng-controller
?我有:
<div ng-controller="myCtrl">
......当它应该被删除时:
<div>
...因为我在路由器的解析中设置了控制器。这就是我正在做的事情,它正在引发这个问题。你可以在这里看到更多:
答案 1 :(得分:2)
foo_list&lt; - 是在脚本标记的html页面中加载的js文件?当你忘记包含工厂/服务/控制器并且实际上忘记将它包含在index / app html页面中的脚本标记中(或者需要垫片)时,可能就是这样的情况
好的,只是看到你的评论并在这里扩展答案,因为这里更容易做到。
您声明控制器的代码应该是
App.controller('FoosCtrl',
['$scope', '$location', 'Foos', /* comment out foo_list here*/
function($scope, $location, Foos, foo_list /* this remains */) {
...
}
当路线发生变化时,您在'resolve'中提到的内容将由ui-router解决。但它是你宣布你的FoosCtrl的地方,你实际上没有一个供它解决的提供者。
试一试,上周我有类似的案例。
答案 2 :(得分:0)
就像抬头一样,我只是遇到了一个类似的问题,这个问题是由于将resolve-variables作为依赖项添加到控制器而没有在$stateProvider.state()
中设置响应函数。
添加resolve功能修复了缺失的依赖关系
(我仍然不明白为什么 - 如果有人可以在评论中分享他的知识,我会很高兴)