AngularJS,解析和未知提供者

时间:2013-02-13 04:37:22

标签: angularjs

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

.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做了一些但没有帮助。

3 个答案:

答案 0 :(得分:177)

所以,这个问题与我自己的问题非常相似,我刚刚在Angular IRC频道的人们的帮助下找到了......你是不是偶然设置了你的控制器ng-controller?我有:

    <div ng-controller="myCtrl">

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

    <div>

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

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

答案 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功能修复了缺失的依赖关系
(我仍然不明白为什么 - 如果有人可以在评论中分享他的知识,我会很高兴)