如何将多个服务注入一个控制器?

时间:2013-07-30 15:04:26

标签: javascript angularjs

我有一个EmailAccountsController,我需要在其中注入'Hosting'和'EmailAccount'服务。这是我的代码:

hostingsModule.controller('EmailAccountsCtrl', ['$scope', 'Hosting', 'EmailAccount', function ($scope, Hosting, EmailAccount) {
    var hostingId = 1
    $scope.hosting = Hosting.find(hostingId);
    $scope.emailAccounts = EmailAccount.all(hostingId)
}]);

错误讯息为TypeError: Cannot call method 'all' of undefined

当我只将一个服务注入同一个控制器时,一切正常。有没有办法如何将多个服务注入一个控制器?

编辑:我试图将所有相关代码放入一个文件中。它看起来像这样:

hostingsModule.factory('Hosting', ['$http', function($http) {
    var Hosting = function(data) {
        angular.extend(this, data);
    };

    Hosting.all = function() {      
        return $http.get('<%= api_url %>/hostings.json').then(function(response) {
            return response.data;
        });
    };

    Hosting.find = function(id) {
        return $http.get('<%= api_url %>/hostings/' + id + '.json').then(function(response) {
            return response.data;
        });
    }

    return Hosting; 
}]);

hostingsModule.factory('EmailAccount', ['$http', function($http) {
    var EmailAccount = function(data) {
        angular.extend(this, data);
    };

    EmailAccount.all = function(hostingId) {        
        return $http.get('<%= api_url %>/hostings/' + hostingId + '/email-accounts.json').then(function(response) {
            return response.data;
        });
    };

    EmailAccount.find = function(id) {
        return $http.get('<%= api_url %>/hostings/' + id + '.json').then(function(response) {
            return response.data;
        });
    };
}]);

hostingsModule.controller('EmailAccountsCtrl', ['$scope', 'Hosting', 'EmailAccount',     function($scope, Hosting, EmailAccount) {
    var hostingId = 1;

    $scope.hosting = Hosting.find(hostingId);
    $scope.emailAccounts = EmailAccount.all(hostingId)

    console.log($scope.hosting);
    console.log($scope.emailAccounts);
}]);

1 个答案:

答案 0 :(得分:2)

范围问题。您需要返回EmailAccount,因为它在闭包内初始化。 您需要像return EmailAccount;一样添加Hosting

或尝试此代码:

hostingsModule.factory('EmailAccount', ['$http', function ($http) {
    var service = {
        all: function (hostingId) {
            return $http.get('<%= api_url %>/hostings/' + hostingId + '/email-accounts.json').then(function (response) {
                return response.data;
            });
        },

        find: function (id) {
            return $http.get('<%= api_url %>/hostings/' + id + '.json').then(function (response) {
                return response.data;
            });
        }
    }
    return service;
}]);