Пожалуйста, потерпите меня здесь. Я знаю, что есть и другие ответы, такие как: AngularJS: Сервис против провайдера против фабрики
Однако я все еще не могу понять, когда вы будете использовать сервис на заводе.
Из того, что я могу сказать, фабрика обычно используется для создания «общих» функций, которые могут вызываться несколькими контроллерами: Создание общих функций контроллера
Angular docs, кажется, предпочитает фабрику, а не сервис. Они даже ссылаются на «сервис», когда используют фабрику, что еще более запутанно! http://docs.angularjs.org/guide/dev_guide.services.creating_services
Так когда же можно будет воспользоваться услугой?
Есть ли что-то, что только возможно или намного проще сделать с помощью сервиса?
Есть что-нибудь другое, что происходит за кулисами? Различия производительности / памяти?
Вот пример. Кроме метода объявления, они кажутся идентичными, и я не могу понять, почему я сделал бы одно против другого. http://jsfiddle.net/uEpkE/
Обновление: из ответа Томаса, похоже, подразумевается, что сервис предназначен для более простой логики и фабрики для более сложной логики с закрытыми методами, поэтому я обновил приведенный ниже код скрипты, и кажется, что оба способны поддерживать частные функции?
myApp.factory('fooFactory', function() {
var fooVar;
var addHi = function(foo){ fooVar = 'Hi '+foo; }
return {
setFoobar: function(foo){
addHi(foo);
},
getFoobar:function(){
return fooVar;
}
};
});
myApp.service('fooService', function() {
var fooVar;
var addHi = function(foo){ fooVar = 'Hi '+foo;}
this.setFoobar = function(foo){
addHi(foo);
}
this.getFoobar = function(){
return fooVar;
}
});
function MyCtrl($scope, fooService, fooFactory) {
fooFactory.setFoobar("fooFactory");
fooService.setFoobar("fooService");
//foobars = "Hi fooFactory, Hi fooService"
$scope.foobars = [
fooFactory.getFoobar(),
fooService.getFoobar()
];
}
источник
Ответы:
объяснение
Здесь есть разные вещи:
Первый:
this
" ключевое слово).ref: angular.service против angular.factory
Во-вторых:
Имейте в виду, что все провайдеры в AngularJS (стоимость, константа, услуги, фабрики) являются одиночками!
Третий:
Использование одного или другого (сервис или фабрика) о стиле кода. Но в AngularJS распространенным способом является использование фабрики .
Зачем ?
( ссылка : http://www.amazon.com/Mastering-Web-Application-Development-AngularJS/dp/1782161821 ).
использование
Служба: может быть полезна для совместного использования служебных функций, которые полезно вызывать, просто добавляя
()
ссылку на введенную функцию. Может также работать сinjectedArg.call(this)
или аналогичным.Фабрика: Может быть полезна для возврата функции класса, которая затем может быть новой для создания экземпляров.
Итак, используйте фабрику, когда у вас есть сложная логика в вашем сервисе, и вы не хотите раскрывать эту сложность .
В других случаях, если вы хотите вернуть экземпляр службы, просто используйте службу .
Но я думаю, что со временем вы увидите, что будете использовать фабрику в 80% случаев.
Для более подробной информации: http://blog.manishchhabra.com/2013/09/angularjs-service-vs-factory-with-example/
ОБНОВИТЬ :
Отличный пост здесь: http://iffycan.blogspot.com.ar/2013/05/angular-service-or-factory.html
ОБНОВИТЬ :
Команда AngularJS выполняет свою работу и дает объяснения: http://docs.angularjs.org/guide/providers
И с этой страницы:
источник
allernhwkim первоначально отправил ответ на этот вопрос , связывающую в своем блоге , однако модератор удалил его. Это единственный пост, который я нашел, который не только говорит вам, как сделать то же самое с сервисом, провайдером и фабрикой, но также рассказывает, что вы можете сделать с провайдером, чего не можете с фабрикой, завод, который вы не можете с обслуживанием.
Прямо из его блога:
Это показывает, как CarService всегда будет производить автомобиль с 4 цилиндрами, вы не можете изменить его для отдельных автомобилей. Принимая во внимание, что CarFactory возвращает функцию, которую вы можете сделать
new CarFactory
в своем контроллере, передавая количество цилиндров, характерных для этого автомобиля. Вы не можете сделать это,new CarService
потому что CarService - это объект, а не функция.Фабрики причины не работают так:
И автоматически возвращать функцию, которую вы хотите создать, потому что тогда вы не можете сделать это (добавить вещи в прототип / etc):
Посмотрите, как это буквально завод по производству автомобилей.
Вывод из его блога довольно хорош:
Если вы обнаружите, что вы просто возвращаете объект на фабрику, вам, вероятно, следует использовать сервис.
Не делай этого:
Используйте сервис вместо:
источник
Концепция всех этих провайдеров намного проще, чем кажется на первый взгляд. Если вы рассекаете поставщика и вынимаете различные части, это становится очень ясным.
Проще говоря каждый из этих провайдеров является специализированной версией другого, в следующем порядке:
provider
>factory
>value
/constant
/service
.До тех пор, пока провайдер делает все возможное, вы можете использовать провайдера дальше по цепочке, что приведет к написанию меньшего количества кода. Если он не выполняет то, что вы хотите, вы можете пойти вверх по цепочке, и вам просто нужно написать больше кода.
Это изображение иллюстрирует то, что я имею в виду, на этом изображении вы увидите код для провайдера, с выделенными частями, показывающими, какие части провайдера могут быть использованы для создания фабрики, стоимости и т. Д.
(источник: simplygoodcode.com )
Для получения более подробной информации и примеров из поста в блоге, где я получил изображение, перейдите по ссылке : http://www.simplygoodcode.com/2015/11/the-difference-between-service-provider-and-factory-in-angularjs/
источник
И фабрика, и сервис приводят к созданию одноэлементных объектов, которые могут настраиваться поставщиками и вводиться в контроллеры и блоки выполнения. С точки зрения инженера, нет абсолютно никакой разницы, поступил ли объект с фабрики или из службы.
Итак, когда использовать фабрику, а когда использовать сервис? Это сводится к вашему предпочтению кодирования, и ничего больше. Если вам нравится модульный шаблон JS, то идите на завод. Если вам нравится стиль функции конструктора ("class"), тогда переходите к сервису. Обратите внимание, что оба стиля поддерживают частные члены.
Преимущество службы может заключаться в том, что она более интуитивно понятна с точки зрения ООП: создайте «класс» и, совместно с поставщиком, повторно используйте один и тот же код в разных модулях и изменяйте поведение созданных объектов, просто предоставляя различные параметры для конструктора в блоке конфигурации.
источник
Фабрика не может ничего сделать или сделать лучше по сравнению с Сервисом. И наоборот. Фабрика просто кажется более популярной. Причиной этого является удобство работы с частными / публичными членами. Сервис будет более неуклюжим в этом отношении. При кодировании Сервиса вы стремитесь сделать ваши члены объекта публичными с помощью ключевого слова «this» и можете внезапно обнаружить, что эти открытые члены не видны частным методам (то есть внутренним функциям).
Angular использует ключевое слово «new» для создания службы для вас, поэтому экземпляр Angular, передаваемый в контроллер, будет иметь тот же недостаток. Конечно, вы можете преодолеть проблему, используя это / что:
Но с большой константой Service это может сделать код плохо читаемым. Более того, прототипы Сервиса не будут видеть частных участников - им будут доступны только публичные:
Подводя итог, использование Factory более удобно. Так как у Factory нет этих недостатков. Я бы порекомендовал использовать его по умолчанию.
источник
myapp.service(...)
полностью отсутствует. Гдеnew Service()
предполагается вызывать, в сервисной функции или в месте, где сервис вводится. Третий листинг просто невозможен в контекстеmyapp.service ('Service', function() {...})
.Даже когда они говорят, что все сервисы и фабрики одноразовые, я не согласен на 100% с этим. Я бы сказал, что фабрики - это не одиночки, и в этом смысл моего ответа. Я бы действительно подумал об имени, которое определяет каждый компонент (Service / Factory), я имею в виду:
завод , потому что это не синглтон, вы можете создать столько , сколько вы хотите , когда вы придете, так что он работает как фабрика объектов. Вы можете создать фабрику сущности вашего домена и более комфортно работать с этими объектами, которые могут быть как объекты вашей модели. Когда вы извлекаете несколько объектов, вы можете отобразить их в этих объектах, и он может действовать как еще один слой между DDBB и моделью AngularJs. Вы можете добавлять методы к объектам, чтобы ориентировать их на объекты немного больше, чем в приложении AngularJs.
Между тем сервис является одноэлементной, поэтому мы можем создать только 1 вид, может быть, не создавать, но у нас есть только 1 экземпляр, когда мы внедряем в контроллер, поэтому сервис больше похож на обычный сервис (вызовы покой, функциональность ..) к контролерам.
Концептуально вы можете думать, как сервисы предоставляют сервис, фабрики могут создавать несколько экземпляров (объектов) класса
источник
Сервисы
Синтаксис : module.service ('имя_службы', функция); Результат : при объявлении serviceName в качестве вводимого аргумента вам будет предоставлена фактическая ссылка на функцию, переданную в module.service.
Использование : Может быть полезно для совместного использования служебных функций, которые полезно вызывать, просто добавляя () к введенной ссылке на функцию. Также может быть запущен с injectedArg.call (this) или аналогичным.
Заводы
Синтаксис : module.factory ('factoryName', функция);
Результат : при объявлении factoryName в качестве вводимого аргумента вам будет предоставлено значение, возвращаемое путем вызова ссылки на функцию, переданной в module.factory.
Использование : Может быть полезно для возврата функции 'class', которая затем может быть добавлена new для создания экземпляров.
Провайдеры
Синтаксис : module.provider ('providerName', функция);
Результат : при объявлении providerName в качестве вводимого аргумента вам будет предоставлено значение, возвращаемое путем вызова метода $ get ссылки на функцию, переданной в module.provider.
Использование : Может быть полезно для возврата функции «класс», которая затем может быть новой для создания экземпляров, но для ее внедрения требуется некоторая конфигурация. Возможно, полезно для классов, которые можно использовать в разных проектах? Все еще немного смутно на этом.
источник
Можно использовать как способа, как вы хотите : создать объект или просто для доступа к функциям из обоих
Примечание :
Примечание :
Вывод :
источник
Фабрика и Сервис - наиболее часто используемый метод. Единственное различие между ними заключается в том, что метод Service лучше работает для объектов, которым требуется иерархия наследования, тогда как Factory может создавать примитивы и функции JavaScript.
Функция Provider является основным методом, а все остальные являются просто синтаксическим сахаром. Это необходимо только в том случае, если вы создаете многократно используемый фрагмент кода, который требует глобальной настройки.
Существует пять способов создания сервисов: Value, Factory, Service, Provider и Constant. Вы можете узнать больше об этом здесь угловом сервисе , эта статья объясняет все эти методы на практических демонстрационных примерах.
,
источник