【问题标题】:AngularJS: Factory is always undefined when injected in controllerAngularJS:注入控制器时工厂始终未定义
【发布时间】:2014-08-15 13:59:37
【问题描述】:

我正在尝试一个简单的 AddressBook Angular 应用程序示例。我有一个工厂,它返回一个记录数组,它使用列表控制器显示在列表视图中

angular.module('abModule', ['ngRoute'])
.factory('AddressBook', function() {
    var address_book = [
        {
            "id": 1,
            "first_name": "John",
            "last_name": "Doe",
            "age": 29
        },
        {
            "id": 2,
            "first_name": "Anna",
            "last_name": " Smith",
            "age": 24
        },
        {
            "id": 3,
            "first_name": "Peter",
            "last_name": " Jones",
            "age": 39
        }
    ];
    alert('inside factory function');
    return {
        get: function() {
            return address_book
        }
    };
})
.config(function($routeProvider) {
    $routeProvider
    .when('/', {
        controller:'list_controller',
        templateUrl:'list.html'
    })
    .when('/add', {
        controller:'add_controller',
        templateUrl:'add.html'
    })
    .otherwise({
        redirectTo:'/'
    });          
})
.controller('list_controller',['$scope', function ($scope, AddressBook) {
    $scope.address_book = AddressBook;
}])
.controller('add_controller',['$scope', function ($scope,AddressBook) {
    //$scope.entry = {};
    $scope.save = function() {
        AddressBook.set(
            {
                "id": $scope.address_book.length +1,
                "first_name":$scope.entry.firt_name,
                "last_name":$scope.entry.last_name,
                "age":$scope.entry.age
            }
        );
    };
}]);

这里的“AddressBook”在“list_controller”中始终未定义。知道我哪里出错了吗?非常感谢任何帮助。

【问题讨论】:

  • 您的通讯录没有设置功能

标签: angularjs dependency-injection controller factory


【解决方案1】:

您没有为您的 DI 注释 AddressBook

.controller('list_controller',['$scope', function ($scope, AddressBook) {
    $scope.address_book = AddressBook;
}])

应该是:

.controller('list_controller',['$scope', 'AddressBook', function ($scope, AddressBook) {
    $scope.address_book = AddressBook;
}])

其他控制器也一样。

【讨论】:

    【解决方案2】:

    另一种方法是使用 $inject 声明您的依赖项,它们的使用顺序与您的函数的参数相同,如下所示。它有助于在缩小代码后注入正确的服务。

    var App = angular.module('myApp',[]);
    App.controller('myCtrl',myCtrl);
    
    //inject your dependencies;
    myCtrl.$inject = ["$scope", "AddressBook","anotherService"] // 
    
    function myCtrl($scope,AddressBook,anotherService){
    .....
    }
    

    注意:服务名称将在缩小后重命名,可能会破坏您的应用程序

    【讨论】:

    • 这帮助我找到了我的问题。我的 $inject 看起来像 PostsController.$inject = [ 'postsService', logger ];,其中未定义“记录器”。结果排除引号也会抛出 ReferenceError。
    【解决方案3】:

    在工厂变量中总是未定义的另一个可能原因是声明的依赖项到函数参数列表的映射不正确。例如:

    var loginCtrl = loginModule.controller("loginController", 
        ['$scope', '$window', 'notificationMessage',
        function ($scope, $window, serverDataConvertor, notificationMessage) {
    
        // notificationMessage is undefined because serverDataConvertor factory is not a declared dependency
    
        // controller logic comes here
    }
    

    不幸的是,Angular 不会发出任何警告或错误,这可能会非常令人沮丧,尤其是当依赖项列表很大时。

    【讨论】:

    • 谢谢。只是在沮丧中浪费了 20 分钟,这救了我。
    • @HenryLin - 是的,它发生在我身上,我想提供这个答案。幸运的是,依赖声明在后续版本(Angular 2、Angular 4)中得到了改进。
    • 大约一个月前,我刚开始在一家小公司工作。他们正在使用 AngularJS。但是,他们没有任何升级计划。我意识到如果 AngularJS 在几年内失去支持,这可能会出现问题。也许我可以说服他们现在比以后更好!
    猜你喜欢
    • 1970-01-01
    • 2017-06-14
    • 2015-08-26
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-19
    • 1970-01-01
    相关资源
    最近更新 更多