52

我有两条有决心的路线。像这样:

.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 做了一些事情但没有帮助,我尝试用不同的名称替换。

4

3 回答 3

180

所以,这个问题与我自己的问题惊人地相似,我只是在 Angular IRC 频道的人们的帮助下才发现的......你是不是碰巧设置了你的控制器ng-controller?我有:

    <div ng-controller="myCtrl">

...当它应该被删除时:

    <div>

...因为我在路由器上的解析中设置了控制器。这就是我正在做的事情,它导致了这个问题。你可以在这里看到更多:

https://stackoverflow.com/a/18305423/1306982

于 2013-08-19T01:55:14.770 回答
2

foo_list <- 是在脚本标签中的 html 页面中加载的 js 文件吗?可能是当您忘记包含工厂/服务/控制器并且实际上忘记将其包含在 index/app html 页面的脚本标记中(或需要垫片)时

好的,刚刚看到您的评论并在这里扩展答案,因为在这里更容易做到。

您声明控制器的代码应如下所示

App.controller('FoosCtrl', 
   ['$scope', '$location', 'Foos', /* comment out foo_list here*/ 
    function($scope, $location, Foos, foo_list /* this remains */) {
  ...
}

当路线发生变化时,您在“解决”中提到的事情将由 ui-router 解决。但是,在您声明 FoosCtrl 的地方,您实际上并没有提供者来解决它。

试试这个,上周我也遇到过类似的情况。

于 2013-07-15T00:43:19.563 回答
0

提醒一下,我刚刚遇到了一个类似的问题,这是由于将解析变量作为依赖项添加到控制器而尚未设置响应功能而引起的$stateProvider.state()

添加 resolve 函数修复了缺少的依赖项
(我仍然不太明白为什么 - 如果有人可以在评论中分享他的知识,我会很高兴)

于 2016-03-09T07:22:10.493 回答