1

私は 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

同じコントローラーにサービスを 1 つだけ挿入すると、すべてが機能します。複数のサービスを 1 つのコントローラーに挿入する方法はありますか?

編集: 関連するすべてのコードを 1 つのファイルにまとめようとしました。次のようになります。

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);
}]);
4

1 に答える 1

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;
}]);
于 2013-07-30T15:36:40.400 に答える