AngularJS: фабрика и контроллер

Я новичок в angular и пытаюсь структурировать свое приложение, следуя https://github.com/angular-app/angular-app

Проблема в том, когда я определил свою фабрику и контроллер... app.service

angular.module("app.service", [])
.factory('currencyService', function ($http, $q) {
var getCurrency = function () {
    var deferred = $q.defer();

    $http({
        url: baseUrl + "currency/GetAll/",
        method: "GET"
    }).success(function (data) {
        deferred.resolve(data);
    }).error(function (data, status, headers, config) {

    });
    return deferred.promise;
}
});


controller :
angular.module('vendor.controller.edit',
[
  "acute.select",
  "ui.bootstrap",
  "ngRoute",
  "app.service"
])
.controller('vendorEditCtrl', ["$scope", "$routeParams", "$http", "$modal","currencyService", function ($scope, $routeParams, $http, $modal, currencyService)            {
...
}

Проблема в том, что внутри контроллера currencyService не определено... есть идеи почему?

Спасибо всем, кто может помочь!

3 ответа

Фабрика - это метод, который вызывается для генерации сервиса, поэтому Angular вызывает его, а затем использует возвращаемое значение для регистрации вашего сервиса. В вашем примере вы не возвращаете саму функцию. Это должно решить проблему:

.factory('currencyService', function ($http, $q) {
var getCurrency = function () {
    var deferred = $q.defer();

    $http({
        url: baseUrl + "currency/GetAll/",
        method: "GET"
    }).success(function (data) {
        deferred.resolve(data);
    }).error(function (data, status, headers, config) {

    });
    return deferred.promise;
};
return getCurrency;
});

Обратите внимание, что я добавил строку в конце, которая фактически возвращает функцию.

Как это определено, вы бы назвали это так:

.controller("myController", ["currencyService", function(currencyService) {
   currencyService().then(function(result)...);
});

Ваша фабрика вернулась не туда, поэтому вернулась undefined,

Вы должны сделать так:

angular.module("app.service", [])
.factory('currencyService', function ($http, $q) {
    var deferred = $q.defer(),
        getCurrency = function () {

        $http({
            url: baseUrl + "currency/GetAll/",
            method: "GET"
        }).success(function (data) {
            deferred.resolve(data);
        }).error(function (data, status, headers, config) {
        });
    })

return deferred.promise;
});

Вам нужно создать экземпляр сервиса, factory возвращает конструктор... или вы можете использовать .service вместо .factory

Другие вопросы по тегам