2015-11-25 2 views
2

Угловой концептуальный обзор JS. Независимая бизнес-логика: услуги (заголовок). В описании сказано - перемещение независимой от просмотра логики от контроллера в службу, но код говорит о фабрике. Что мне здесь не хватает?Может ли сервис и завод использоваться взаимозаменяемо?

angular.module('finance2', []) 
.factory('currencyConverter', function() { 
    var currencies = ['USD', 'EUR', 'CNY']; 

Ссылка на метод resource

ответ

1

на заводе ('рецепт') является способ создания 'службы'.

Вы также можете создать «Услуги» с рецептами обслуживания, константы, значения и поставщика («методы»).

Однако вы это сделаете, вы создадите экземпляр объекта, который концептуально является «Сервисом».

Общепризнано, что это смущающий аспект Углового. См. this classic Stackoverlow question.

Руководство разработчика делает хорошую работу по разъяснению этих понятий также:

Каждое веб-приложение, вы строите состоит из объектов, которые взаимодействуют, чтобы получить вещи сделано. Эти объекты должны быть созданы и объединены для работы приложения. В Угловых приложениях большинство этих объектов создаются и автоматически соединяются с помощью службы инжектора.

Инжектор создает два типа объектов, сервисов и специализированных объектов.

Услуги - это объекты, API которых определяется разработчиком, который пишет услугу.

Специализированные объекты, соответствующие конкретному API-интерфейсу с угловым каркасом. Эти объекты являются одним из контроллеров, директив, фильтров или анимаций.

Инжектор должен знать, как создать эти объекты. Вы скажете это, зарегистрировав «рецепт» для создания вашего объекта с помощью инжектора. Существует пять типов рецептов.

Самым подробным, но и наиболее полным является рецепт поставщика. Остальные четыре типа рецептов - Value, Factory, Service и Constant - всего лишь синтаксический сахар поверх рецепта поставщика.

+1

Спасибо. Я читал о службах и фабриках. Если вы посмотрите на исходный код при вызове service(), он фактически вызовет factory(). Я просто не понимал, что делать вещи более запутанной фабрикой - тоже услуга. Facepalm. –

+0

Завод не является сервисом. Factory - это «рецепт» для создания _creating_. Аналогичным образом, рецепт службы - это еще один способ создания службы. –

+0

Другими словами, их концептуальный обзор сосет. –

1

Исходя из фона Java, мне очень нравится концепция угловых заводов; мы до некоторой степени имитируем POJO. Я могу придать содержательные методы и выполнить логику, которая является самодостаточной в самой модели. В то время как для служб я склонен рассматривать их так, как я бы рассматривал сервис на стороне сервера, просто для получения данных.

Например, если бы мы создали какой-то твитер Twitter, для потока твитов у меня был бы TweetSteamFactory, который внутренне извлекает данные с помощью TweetService, чтобы получить последние твиты. Может быть, у моей фабрики есть метод getNextPage(), который привязан к ngClick где-то - когда он запущен, он, конечно, делает свой звонок с TweetService.

Во всяком случае, я вижу довольно четкое различие между службами и фабриками, хотя мое понимание может быть ошибочным.

http://plnkr.co/edit/SqPf212nE5GrSPcZdo5K

Контроллер

app.controller('MyController', function(FoobarFactory) { 
    FoobarFactory() 
     done(function(factory) { 
     var factory = factory; 
     $scope.data = factory.getData(); 
     $scope.baz = factory.getBaz(); 
     }) 
}); 

завод

app.factory('FoobarFactory', ['MyService', function(MyService) { 

    function Foobar() {};      // Empty constructor 

    angular.extend(Foobar.prototype, { 
     _init: function() { 
      var deferred = $.Deferred();    

      var foobar = this; 

      this.baz = true; 
      this.data = undefined; 

      MyService.getData() 
       .done(function(data) { 
        foobar.data = data; 
        deferred.resolve(foobar); 
       }) 

      deferred.resolve(); 

      return deferred.promise(); 
     }, 
     getBaz: function() { 
      return this.baz; 
     }, 
     getData: function() { 
      return this.data; 
     } 

    }); 

    return function() { 
     var deferred = $.Deferred(); 
     var foobar = new Foobar(); 

     foobar._init() 
      .done(function() { 
       deferred.resolve(foobar); 
      }) 
      .fail(function(error) { 
       deferred.reject(error); 
      }); 

     return deferred.promise(); 
    }; 

}]); 
Смежные вопросы