为什么这个工厂返回undefined?

时间:2014-08-29 05:09:19

标签: angularjs

我想帮助弄清楚为什么我创建的这个服务在将它打印到控制台时返回undefined。

module.js

'use strict';
var Search = angular.module('SearchApp',["ngCookies","ngRoute"]);

Search.run(function ($http, $cookies) {
    $http.defaults.headers.common['X-CSRFToken'] = $cookies['csrftoken'];
});

Search.config(function($routeProvider){
    $routeProvider
        .when('/', {
            controller:'searchCtrl',
            resolve: {
                dota_items: function (InventoryService){
                    return InventoryService.get('dota');
                }
            }
        })
        .otherwise({
            redirectTo: '/'
        })
});

这是我声明路线的模块文件。

servcie.js

Search.factory('InventoryService', function ($http, $q) {
    var api_url = "/api/inventory/";
    return {
        get: function (inventory) {
            var inv_url = api_url + inventory + '/';
            var defer = $q.defer();
            $http({method: 'GET', url: inv_url}).
                success(function (data, status, headers, config){
                    defer.resolve(data);
                })
                .error(function (data,status, headers, config){
                    defer.reject(status);
                });
            return defer.promise;
        }
    }
});

据我所知,语法对我的服务是正确的,但我可能错过了一些东西。

controller.js

Search.controller('searchCtrl',['$scope', function($scope, dota_items){

    console.log(dota_items);
    $scope.selected = 'have';

    $scope.setSection = function(section){
        $scope.selected = section;
    };

    $scope.isSelected = function(section){
        return $scope.selected == section;
    };

}]);

问题是,在控制台中,变量始终是未定义的。我试图通过打印到控制台来检查我的服务是否被调用,但是没有记录任何内容。我不确定问题是什么。

由于

1 个答案:

答案 0 :(得分:1)

使用inlined array dependency injection语法

声明'searchCtrl'控制器时
['$scope', function($scope, dota_items) { }] 

angular忽略函数中的实际参数名称,以支持您在数组中指定的内容。请考虑在dota_items之前将function添加到数组中。

Search.controller('searchCtrl', ['$scope','dota_items',function($scope, dota_items) {
  // your code
}]);

您也可以完全删除数组并使用angular的隐式依赖项功能,如下所示:

Search.controller('searchCtrl', function($scope, dota_items) {
  // your code
});

但应该注意的是,只有在您不对代码进行缩小或混淆时,此方法才有效。