AngularJS. Сервисы и фабрики


Содержание материала:

Stepan Suvorov Blog

Release 2.0

С чего начать изучение AngularJS. Часть3 – Ох уж эти сервисы.

По просьбам трудящихся продолжаю серию постов на тему “С чего начать изучение AngularJS” (часть1, часть2). В этой части я постараюсь вкратце осветить применение сервисов в AngularJS.

UPD: Статья обновлена 1.11.2020

Итак, что такое сервисы? Это по большому случаю то, что не попадает под определение представления.

Основное предназначение сервисов:

  • логика (бизнес логика) приложения
  • коммуникация между виджетами
  • уровень данных и запросы к серверу
  • хранение состояния

Логика приложения

Приведу простейший пример: допустим нам нужно сделать приложение-калькулятор. Для этого в сервис поместим все операции по вычислению:

теперь мы можем подключить нашу зависимость – сервис Calculator – в контроллер компонента и использовать его методы:

Полный пример можно посмотреть тут.

Коммуникация между виджетами

Передача данных между сущностями Ангуляра довольно подробно рассмотрена в этом посте. Ничего тут особого нет: в одном месте инжектим сервис, задаем значение, инжектим вдругом месте, читаем/меняем значение.

Уровень данных и запросы к серверу

Уровень данных( или наши модели данных), который включает ajax-запросы к серверу. Давайте напишем простую модельку User с двумя методами:

теперь мы можем получить пользователей сервера и передать их в контроллер компонента по средством нашего сервиса:

С полным примером можно поиграться тут.

!Внимание: для получения даных с сервера был использован метод jQuery$.get(). Это было сделано лишь с той целью, чтобы упростить пример и сфокусироваться больше на рассмотрении модели даных, а не способа их получения. В реальных проектах для получения данных лучше использовать сервис $http, а еще лучше его обертку типа Restangular или $resource.

Хранение состояния

Идея в том, что контроллеры могут быть перезагружены в процессе работы приложения, поэтому мы не можем гарантировать, что данные приложения сохраненные в контроллере сохранятся.

Простейший пример этому будет сервис авторизации и хранение значение авторизирован ли пользователь или нет:

Типы сервисов

AnguarJS уже содежит в себе большой набор сервисов, поэтому первой классификацией будет:

Если посмотреть с другой стороны, то мы можем охарактеризовать все сервисы по типу вызова провайдера:

Теперь пару слов о каждом, плюс примеры.

constant и value

Оба типа служат для хранения каких либо изначальных настроек, конфигурационных опций и параметров по умолчанию. Значением может быть как примитив так и объект.

Отличие между constant и value заключается в том, что значение константы задается при определении и не может быть изменено другим путем. Плюс константа может быть внедрена в config(), а value может быть использована, только в последующих стадиях (например run())

service, factory и provider

По сути одно и тоже. Уже было довольно подробно описаны тут и тут.

Если вы начинающий AngularJS разработчик (а этот пост именно для таковых) рекомендую ограничится пока только использованием service.

декораторы

Декораторы или декорирование сервис провайдеров создано для модификации, переопределения, расширения сервисов на этапе конфигурации. Как мне кажется, наилучшее для них применение – это модификация сторонних библиотек, которые мы не хотим править напрямую.

Рекомендую ознакомиться с вот этой статьей о внедрении зависимостей и месте декораторов в этом процессе.

Если что-то не понятно – пожалуйста задавайте вопросы в комментариях – я постараюсь обновить пост исходя из вопросов.

AngularJS Сервисы

В AngularJS вы можете сделать свой собственный сервис, или использовать один из многих встроенных услуг.

Что такое служба?

В AngularJS, услуга является функцией, или объект, который доступен для, и ограничено, приложение AngularJS.

AngularJS имеет около 30 встроенных служб. Одним из них является $location службы.

$location сервиса есть методы , которые возвращают информацию о местоположении текущей веб — страницы:

пример

Используйте $location службы в контроллере:

Обратите внимание , что $location службы передается к контроллеру в качестве аргумента. Для того чтобы воспользоваться услугой в контроллере, он должен быть определен как зависимость.

Зачем использовать услуги?

Для многих услуг, как $location службы, кажется , что вы могли бы использовать объекты, которые уже находятся в DOM, как window.location объект, и вы могли бы, но это будет иметь некоторые ограничения, по крайней мере , для вашего приложения AngularJS.

AngularJS постоянно контролирует ваше приложение, и для того , чтобы обрабатывать изменения и события должным образом, AngularJS предпочитает , чтобы вы использовали $location службы вместо window.location объекта.

$ HTTP Service

$http услуг является одним из наиболее распространенных используемых услуг в AngularJS приложениях. Услуга делает запрос на сервер, и позволяет ваше приложение обрабатывает ответ.

пример

Используйте $http сервис для запроса данных с сервера:

Этот пример демонстрирует очень простое использование $http службы. Узнайте больше о $http службе в AngularJS Http Учебное пособие .

$ Тайм-аут Обслуживание

$timeout — window.setTimeout $timeout обслуживание версия AngularJS ‘от window.setTimeout функции.

пример

Дисплей нового сообщения через две секунды:

Служба $ Интервал

$interval обслуживание версия AngularJS ‘от window.setInterval функции.

пример

Отображение времени каждую секунду:

Создайте свой собственный сервис

Чтобы создать свою собственную службу, подключить услугу к модулю:

Создание службы с именем hexafy :

Чтобы использовать выполненное на заказ обслуживание, добавьте его в качестве зависимости при определении фильтра:

пример

Используйте выполненное на заказ обслуживание по имени hexafy преобразовать число в шестнадцатеричное число:

С помощью специальной услуги Внутри фильтра

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

Чтобы воспользоваться услугой, внутри фильтра, добавьте его в качестве зависимости при определении фильтра:

Служба hexafy используется в фильтре myFormat :

Вы можете использовать фильтр при отображении значений из объекта или массива:

AngularJS: Когда использовать сервис вместо фабрики

Пожалуйста, потерпите меня здесь. Я знаю, что есть другие ответы, такие как: AngularJS: Сервис против провайдера против фабрики

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

Из того, что я могу сказать, фабрика обычно используется для создания «общих» функций, которые могут вызываться несколькими контроллерами: Создание общих функций контроллера

Документы Angular, похоже, предпочитают заводские, а не сервисные. Они даже ссылаются на «сервис», когда используют фабрику, что еще более запутанно! http://docs.angularjs.org/guide/dev_guide.services.creating_services

Так когда же можно будет использовать сервис?

Есть ли что-то, что только возможно или намного проще сделать с помощью сервиса?

Есть что-нибудь другое, что происходит за кулисами? Различия производительности/памяти?

Вот пример. Кроме метода объявления, они кажутся идентичными, и я не могу понять, почему я сделал бы одно против другого. http://jsfiddle.net/uEpkE/

Обновление: Из ответа Томаса, похоже, подразумевается, что сервис предназначен для более простой логики и фабрики для более сложной логики с закрытыми методами, поэтому я обновил код скрипты ниже, и кажется, что оба способны поддерживать частные функции?

Объяснение

Здесь есть разные вещи:

Первый:

  • Если вы используете сервис, вы получите экземпляр функции (ключевое слово » this «).
  • Если вы используете фабрику, вы получите возвращаемое значение, вызвав ссылку на функцию (оператор return в фабрике).

Второе:

Имейте в виду, что все провайдеры в AngularJS (стоимость, константа, услуги, фабрики) являются одиночками!

Третье:

Использование одного или другого (сервис или фабрика) о стиле кода. Но общий способ в AngularJS — это использование фабрики .

Потому что «Фабричный метод является наиболее распространенным способом получения объектов в систему внедрения зависимостей AngularJS. Он очень гибкий и может содержат сложную логику создания. Поскольку фабрики являются обычными функциями, мы также можем воспользоваться новой лексической областью для моделирования «частных» переменных. Это очень полезно, поскольку мы можем скрыть детали реализации данного сервиса. «

Использование

Служба: Может быть полезна для совместного использования служебных функций, которые полезно вызывать, просто добавляя () в ссылку на введенную функцию. Также может быть запущен с injectedArg.call(this) или подобным.

Factory: Может быть полезно для возврата функции «class», которая затем может быть новой для создания экземпляров.

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

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

Но я думаю, что со временем вы увидите, что будете использовать фабрику в 80% случаев.

ОБНОВЛЕНИЕ:

«Если вы хотите, чтобы ваша функция вызывалась как обычная функция , используйте factory . Если вы хотите, чтобы ваша функция создавалась с помощью нового оператора, используйте сервис. Если вы не знаете разницу, используйте фабрику. «

ОБНОВЛЕНИЕ:

Команда AngularJS выполняет свою работу и дает объяснения: http://docs.angularjs.org/guide/providers

И с этой страницы:

«Фабрика и Сервис — наиболее часто используемые рецепты. Единственное отличие между ними состоит в том, что Сервисный рецепт работает лучше для объектов пользовательского типа, тогда как Фабрика может создавать примитивы и функции JavaScript».

allernhwkim первоначально опубликовано ответ по этому вопросу ссылка на его блог , однако модератор удалил его. Это единственный пост, который я нашел, который не только говорит вам, как сделать то же самое с сервисом, провайдером и фабрикой, но также рассказывает, что вы можете сделать с провайдером, чего не можете с фабрикой, и с завод, который вы не можете с обслуживанием.

Прямо из его блога:

Это показывает, как CarService всегда будет производить автомобиль с 4 цилиндрами, вы не можете изменить его для отдельных автомобилей. Принимая во внимание, что CarFactory возвращает функцию, чтобы вы могли выполнять new CarFactory в своем контроллере, передавая количество цилиндров, характерных для этой машины. Вы не можете сделать new CarService , потому что CarService — это объект, а не функция.

Фабрики причины не работают так:

И автоматически возвращать функцию, которую вы хотите создать, потому что тогда вы не можете сделать это (добавить вещи в прототип/etc):

Посмотрите, как это буквально завод по производству автомобилей.

Вывод из его блога довольно хорош:

Используйте Service, когда вам нужен простой объект, такой как Hash, например, Код легко написать, но вы не можете создать его экземпляр.

Используйте Factory, когда вам нужно создать экземпляр объекта, то есть new Customer (), new Comment () и т.д.

Используйте провайдера, когда вам нужно его настроить. то есть тестовый URL, QA URL, производственный URL.

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

Используйте сервис вместо:

Концепция всех этих провайдеров намного проще, чем кажется на первый взгляд. Если вы рассекаете поставщика и вынимаете разные части, это становится очень ясным.

Проще говоря, каждый из этих поставщиков является специализированной версией другого в следующем порядке: provider > factory > value / constant / service .

До тех пор, пока провайдер делает все возможное, вы можете использовать провайдера дальше по цепочке, что приведет к написанию меньшего количества кода. Если он не выполняет то, что вы хотите, вы можете пойти вверх по цепочке, и вам просто нужно написать больше кода.

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

Для получения более подробной информации и примеров из поста в блоге, где я получил изображение, перейдите по адресу: http://www.simplygoodcode.com/2015/11/the-difference-between-service-provider-and-factory- в-angularjs /

И фабрика, и сервис приводят к созданию одноэлементных объектов, которые могут настраиваться поставщиками и вводиться в контроллеры и блоки выполнения. С точки зрения инженера, нет абсолютно никакой разницы, поступил ли объект с фабрики или из службы.

Итак, когда использовать фабрику, а когда использовать сервис? Это сводится к вашему предпочтению кодирования, и ничего больше. Если вам нравится модульный шаблон JS, то идите на завод. Если вам нравится стиль функции конструктора («class»), тогда переходите на сервис. Обратите внимание, что оба стиля поддерживают закрытые члены.

Преимущество службы может заключаться в том, что она является более интуитивной с точки зрения OOP: создайте «класс» и, совместно с поставщиком, повторно используйте один и тот же код в разных модулях и измените поведение создаваемые объекты просто предоставляя различные параметры конструктору в блоке конфигурации.

Даже когда они говорят, что все сервисы и фабрики одноразовые, я не согласен на 100% с этим. Я бы сказал, что фабрики — это не одиночки, и в этом смысл моего ответа. Я бы действительно подумал об имени, которое определяет каждый компонент (Service/Factory), я имею в виду:

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

Между тем, service является одиночным, поэтому мы можем создать только 1 из них, может быть, не создавать, но у нас есть только 1 экземпляр, когда мы внедряем в контроллер, поэтому сервис больше похож на обычный сервис ( остальные вызовы, функционал ..) к контролерам.

Концептуально вы можете думать, как сервисы предоставляют сервис, фабрики могут создавать несколько экземпляров (объектов) класса

Фабрика не может ничего сделать или сделать лучше по сравнению с Сервисом. И наоборот. Фабрика просто кажется более популярной. Причиной этого является удобство работы с частными/публичными членами. Сервис будет более неуклюжим в этом отношении. При кодировании Сервиса вы стремитесь сделать ваши члены объекта публичными с помощью ключевого слова «this» и можете внезапно обнаружить, что эти открытые члены не видны частным методам (то есть внутренним функциям).

Angular использует ключевое слово «new» для создания службы для вас, поэтому экземпляр Angular, передаваемый контроллеру, будет иметь тот же недостаток. Конечно, вы можете преодолеть проблему, используя это/что:

Но с большой константой Service это может сделать код плохо читаемым. Более того, прототипы Сервиса не будут видеть приватных участников — им будут доступны только публичные:

Подводя итог, использовать Фабрику удобнее. Так как у Factory нет этих недостатков. Я бы порекомендовал использовать его по умолчанию.

услуги

синтаксис: module.service (‘имя_службы’, функция); Результат: При объявлении serviceName в качестве вводимого аргумента вам будет предоставлена ​​фактическая ссылка на функцию, переданную в module.service.

Использование: Может быть полезно для совместного использования служебных функций, которые полезно вызывать, просто добавляя () к ссылке на введенную функцию. Также может быть запущен с помощью injectedArg.call (this) или аналогичным.

заводы

синтаксис: module.factory (‘factoryName’, функция);

Результат: При объявлении factoryName в качестве вводимого аргумента вам будет предоставлено значение, возвращаемое путем вызова ссылки на функцию, переданной в module.factory.

Использование: Может быть полезно для возврата функции ‘class’, которая затем может быть новой для создания экземпляров.

Провайдеры

синтаксис: module.provider (‘providerName’, функция);

Результат: При объявлении providerName в качестве вводимого аргумента вам будет предоставлено значение, возвращаемое путем вызова метода $ get ссылки на функцию, переданной в module.provider.

Использование: Может быть полезно для возврата функции ‘class’, которая затем может быть new’ed для создания экземпляров, но которая требует некоторой конфигурации перед вводом. Возможно, полезно для классов, которые можно использовать в разных проектах? Все еще немного смутно на этом.

Фабрика и Сервис — наиболее часто используемый метод. Единственная разница между ними заключается в том, что метод Service работает лучше для объектов, которым требуется иерархия наследования, тогда как Factory может создавать примитивы и функции JavaScript.

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

Существует пять способов создания сервисов: Value, Factory, Service, Provider и Constant. Вы можете узнать больше об этом здесь angular service , эта статья объясняет все эти методы на практических демонстрационных примерах.

Можно использовать оба так, как вы хотите: будь создать объект или j только для доступа к функциям из обоих

Вы можете создать новый объект из сервиса

  • сервис по умолчанию возвращает объект, а не функцию конструктора.
  • Вот почему для функции конструктора установлено свойство this.model.
  • Благодаря этому сервис вернет объект, но только внутри этого объекта будет функция конструктора, которая будет использоваться для создания нового объекта;

Вы можете создать новый объект с фабрики

  • фабрика по умолчанию возвращает функцию конструктора, а не объект.
  • Вот почему новый объект может быть создан с помощью функции конструктора.

Создать сервис для простого доступа к простым функциям

Создать фабрику для простого доступа к простым функциям

  • вы можете использовать оба так, как вы хотите для создания нового объекта или просто для доступа к простым функциям
  • Там не будет никакого снижения производительности, используя один над другим
  • Оба являются одноэлементными объектами, и для каждого приложения создается только один экземпляр.
  • Будучи только одним экземпляром каждый раз, когда передается их ссылка.
  • В angular документации фабрика называется сервисом, а также сервис называется сервисом.

в angularjs : когда использовать сервис вместо фабрики

Please bear with me here. I know there are other answers such as: AngularJS: Service vs provider vs factory

However I still can’t figure out when you’d use service over factory.Creating common controller functions

Насколько я могу судить завода широко используется для создания «общих» функций, которые могут быть вызваны несколькими контроллерами:

Угловая документы, похоже, предпочитают завода за обслуживание. Они даже ссылаются на «службе», когда они используют фабрику, которая еще больше запутывает!

So when would one use service?

Is there something that is only possible or much easier done with service?

Есть ли что-нибудь другое, что происходит за кулисами? Производительность/различия памяти?

Вот пример. Другие, чем метод декларации, они, кажется, идентичны и я не могу понять, почему я сделаю одна против другой.

Update:

Из ответа Томаса, кажется, подразумевает, что служба для упрощения логики и фабрики для более сложной логики с частными методиками, так я обновил код ниже скрипку и, кажется, оба способны поддерживать собственной функции?

Ответ 1

У вас тут разные вещи:

First:

  • If you use a service you will get the instance of a function (» this » keyword).
  • If you use a factory you will get the value that is returned by invoking the function reference (the return statement in factory). ref:angular.service vs angular.factory

    Second:

    Имейте в виду, все поставщики на AngularJS (величина, константа, сервис, заводы) являются одиночными элементами!

    Third:

    common wayfactory

    Используя один или другой (сервис или завод) о стиле Кода.Но на AngularJS, это использование .

    Because «The factory method is the most common way of getting objects into AngularJS dependency injection system. It is very flexible and can contain sophisticated creation logic. Since factories are regular functions, we can also take advantage of a new lexical scope to simulate «private» variables. This is very useful as we can hide implementation details of a given service.»

    Может быть полезно для совместного использования функций полезности, которые могут пригодиться для вызова, просто добавляя к вводят ссылка на функцию. Также может быть запущен или похожие.

    Может быть полезно при возврате функции класса, которые затем могут быть новые объед для создания экземпляров.

    use a factory when you have complex logicyou don’t want expose this complexity

    if you want to return an instance of a service just use service

    В других случаях .

    Но вы увидите со временем, что вы будете использовать завод в 80% случаев я думаю.

    Для более подробной информации:

    Отличный пост здесь :

    «If you want your function to be called like a normal function, use factory. If you want your function to be instantiated with the new operator, use service. If you don’t know the difference, use factory.»

    Команда в AngularJS делает свою работу и дать объяснение:

    И на этой странице :

    «Factory and Service are the most commonly used recipes. The only difference between them is that Service recipe works better for objects of custom type, while Factory can produce JavaScript primitives and functions.»

    Ответ 2

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

    Прямо из его блога:

    new CarFactory new CarService

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

    Почему заводы не работают как это:

    И автоматический возврат функция для вас, чтобы создать, потому что тогда вы не можете этого сделать (добавить вещи в прототип/и т. д.):

    Посмотрим, как это буквально фабрика, производящая машины.

    Вывод из своего блога-это очень хорошо:

    используйте службу, когда вам нужно только простой объект, такой как хэш, например <фу

    Если вы обнаружили, что вы просто возвращая объект в Заводском, вы должны, вероятно, использовать сервис.

    Ответ 3

    Понятие для всех этих поставщиков значительно проще, чем это кажется на первый взгляд. Если препарировать поставщика и вынуть разные части становится предельно ясно.

    provider factory value constant service

    Попросту говоря, каждый из этих поставщиков является специальной версией другой, в таком порядке: > > / / .

    Так долго провайдер делает то, что вы можете использовать в дальнейшем поставщик в цепочке, которая приведет в писать меньше кода. Если это не выполнить то, что вы хотите, вы можете пойти по цепочке и вам придется писать больше кода.

    Это изображение иллюстрирует то, что я имею в виду, в этом образе вы увидите код поставщика, частями подчеркнул, показывая, какие части поставщика могут быть использованы для создания, а не завод, стоимость и т. д.

    Для получения более подробной информации и примеров из блога, где я получил изображение из перейти к:

    Ответ 4

    Как завод, так и результат оказания услуги в синглтон объекты, которые могут быть настроены поставщиками и вводят в контроллеры и запускать блоки. С точки зрения injectee, нет абсолютно никакой разницы, является ли объект пришел с завода или услуга.

    Итак, когда использовать заводской и, когда использовать сервис? Она сводится к вашим предпочтениям кодирования, и ничего другого. Если вам нравятся модульные картины в JS, то идти на завод. Если вам нравится функция конструктора («класс») стиль, то идти на службу. Обратите внимание, что оба стиля поддержки частных членов.

    Полезен сервис может быть, что это более понятный с точки зрения ООП: создать «класс», и, совместно с поставщиком, повторно использовать тот же код для всех модулей, и меняют поведение создаваемых объектов просто поставляя различные параметры в конструктор в конфигурационном блоке.

    Ответ 5

    Нет ничего, что завод не может делать или делает лучше по сравнению с сервисом. И наоборот. Завод только кажется, чтобы быть более популярным. Причиной этому является его удобство в обращении членов приватное/публичное. В этой связи все более топорно.При кодировании сервиса вы, как правило, делают ваши члены общественного объекта через “это” ключевое слово и может вдруг обнаружить, что те члены общественности не видны частные методы (т. е. внутренние функции).

    Угловой использует ключевого слова “new”, чтобы создать сервис для вас, поэтому экземпляр угловые передает на контроллер будет иметь тот же недостаток.Конечно, вы можете преодолеть проблему с помощью этого/, что:

    Но с большим сервисом постоянный это\что-инж бы сделать код плохо читаемым.Кроме того, прототипы услуги не увидите собственными членами – только может быть доступно:


    Подводя его итоги, с помощью фабрики является более удобным. Как фабрика не имеет этих недостатков. Я бы рекомендовал использовать его по умолчанию.

    Ответ 6

    Даже когда они говорят, что все сервисы и заводы синглтон, я не согласен на 100 процентов с этим. Я бы сказал, что заводы не синглтоны и это смысл моего ответа. Я действительно думаю о названии, которое определяет все компоненты(услуги/фабрики), я имею в виду:

    factory

    А ведь это не синглтон, вы можете создать столько, сколько вы хотите, когда вы вводите, так он работает как фабрика объектов. Вы можете создать фабрику сущности вашего домена и работать более комфортно с этим объекты, которые могли бы быть похожим на объект вашей модели. При получении нескольких объектов можно сопоставить их в этих объектах, и он может выступать своего рода еще один слой между DDBB и модели в AngularJS.Вы можете добавить методы к объектам, так что вы ориентированы на объекты немного больше приложения в AngularJS.

    service

    Между тем это Singleton, поэтому мы можем создать только 1 вид, может быть, не создать, но у нас есть только 1 случай, когда мы введем в контроллер, так что служба предоставляет больше похоже на общие услуги(вызовы REST,функциональность.. ) к контроллерам.

    Концептуально вы можете думать, как услуги предоставлять услугу, фабрики могут создать несколько экземпляров(объектов) класса

    Ответ 7

    : модуль.обслуживания( ‘имя’, функция )

    Usage

    : Может быть полезно для совместного использования функций полезности, которые являются полезными, чтобы вызвать путем простого добавления (), чтобы впрыснутый ссылка на функцию. Также может быть запущен с injectedArg.звоните () или похожие.

    FactoriesSyntax

    : модуль.фабрика( ‘factoryName’, функция )

    Result

    : При объявлении factoryName как injectable аргумент вам будет предоставлен значения, возвращаемые при вызове функции передается в модуль.фабрика.

    Usage

    : Может быть полезно при возврате функции класса, которые затем могут быть новые объед для создания экземпляров.

    ProvidersSyntax

    : модуль.поставщика( ‘имя_поставщика’, функция )

    Топ-пост этого месяца:  Как вывести название рубрики в виджете

    Result

    : При объявлении имя_поставщика как injectable аргумент вам будет предоставлен значения, возвращаемые при вызове $get метод эталонной функцией, переданной модулем.поставщика.

    Usage

    : Может быть полезно при возврате функции класса, которые затем могут быть новые объед создавать экземпляры, но это требует некоторой настройки перед подачей. Возможно, полезно для классов, которые можно использовать повторно в разных проектах? Еще как в тумане от этого.

    Ответ 8

    Можно использовать как : Будь или J от

    You can create new object from service

  • service by default returns object and not constructor function .
  • So that’s why constructor function is set to this.model property.
  • Due to this service will return object,but but but inside that object will be constructor function which will be use to create new object;

    You can create new object from factory

  • factory by default returns constructor function and not object .
  • So that’s why new object can be created with constructor function.

    Create service for just accessing simple functions

    Create factory for just accessing simple functions

  • you can use both the way you want whether to create new object or just to access simple functions
  • There won’t be any performance hit , using one over the other
  • Both are singleton objects and only one instance is created per app.
  • Being only one instance every where their reference is passed.
  • In angular documentation factory is called service and also service is called service.

    AngularJS Разница между сервисом и фабрикой

    пример

    1) Услуги

    Служба — это функция- constructor которая вызывается один раз во время выполнения с new , точно так же, как то, что мы будем делать с простым javascript, с той лишь разницей, что AngularJs вызывает new за кулисами.

    В случае обслуживания есть одно правило большого пальца

    1. Услуги — это конструкторы, которые называются new

    Давайте посмотрим простой пример, в котором мы зарегистрировали бы службу, которая использует службу $http для получения сведений о студенте и использования ее в контроллере

    Мы просто вводим эту услугу в контроллер

    Используйте .service() везде, где вы хотите использовать конструктор. Обычно он используется для создания общедоступного API, как и для getStudentDetails() . Но если вы не хотите использовать конструктор и хотите использовать простой шаблон API, то в .service() нет большой гибкости.

    2) Фабрика

    Несмотря на то, что мы можем достичь всего, что использует .factory() которое мы использовали бы, используя .services() , он не делает .factory() «таким же, как« .service() . Он намного более мощный и гибкий, чем .service()

    A .factory() — шаблон проектирования, который используется для возврата значения.

    В случае фабрик есть два правила большого пальца

    1. Возвращаемые значения фабрик
    2. Заводы (могут) создавать объекты (Любой объект)

    Давайте посмотрим некоторые примеры того, что мы можем сделать, используя .factory()

    Литералы возвращающихся объектов

    Давайте посмотрим пример, когда фабрика используется для возврата объекта с использованием шаблона базового модуля раскрытия

    Использование внутри контроллера

    Возвратные закрытия

    Что такое закрытие?

    Закрытие — это функции, которые относятся к переменным, которые используются локально, но определены в охватывающей области.

    Ниже приведен пример закрытия

    «Замечательная» часть состоит в том, что она может получить доступ к name которое находится в родительской области.

    Давайте воспользуемся приведенным выше примером закрытия внутри .factory()

    Использование внутри контроллера

    Создание конструкторов / экземпляров

    .service() создает конструкторы с вызовом new как показано выше. .factory() также может создавать конструкторы с призывом к new

    Давайте посмотрим пример того, как достичь этого.

    сервисы AngularJS: Сервис против поставщика и завода

    angularjs сервисы фабрики (24)

    Сервис против поставщика и завода:

    Я стараюсь, чтобы все было просто. Все дело в базовой концепции JavaScript.

    Прежде всего, давайте поговорим об услугах в AngularJS!

    Что такое услуга: в AngularJS, сервисэто не что иное, как одиночный JavaScript-объект, который может хранить некоторые полезные методы или свойства. Этот одноэлементный объект создается на основе ngApp (Angular app), и он распределяется между всеми контроллерами в текущем приложении. Когда Angularjs создает экземпляр объекта службы, он регистрирует этот служебный объект с уникальным именем службы. Поэтому каждый раз, когда нам нужен экземпляр службы, Угловой поиск реестра для этого имени службы и возвращает ссылку на объект службы. Таким образом, мы можем вызывать метод, свойства доступа и т. Д. В объекте службы. У вас может возникнуть вопрос, можете ли вы также поместить свойства, методы в объект объекта scope контроллеров! Итак, зачем вам нужен служебный объект? Ответы: услуги распределяются между несколькими областями контроллера. Если вы поместите некоторые свойства / методы в объект области действия контроллера, он будет доступен только для текущей области.Но когда вы определяете методы, свойства объекта службы, он будет доступен по всему миру и может быть доступен в любой области управления, введя эту услугу.

    Поэтому, если есть три области контроллера, пусть это будет контроллерА, контроллер Б и контроллер С, все будут иметь один и тот же экземпляр службы.

    Как создать службу?

    AngularJS предоставляет различные методы регистрации услуги. Здесь мы сосредоточимся на трех методах factory (..), service (..), provider (..);

    Заводская функция:

    Мы можем определить заводскую функцию, как показано ниже.

    AngularJS предоставляет метод factory (‘serviceName’, fnFactory), который принимает два параметра, serviceName и функцию JavaScript. Угловой создает экземпляр службы, вызывая функцию fnFactory (), например, ниже.

    Передаваемая функция может определять объект и возвращать этот объект. AngularJS просто сохраняет эту ссылку объекта на переменную, которая передается в качестве первого аргумента. Все, что возвращается из fnFactory, будет привязано к serviceInstance. Вместо того, чтобы возвращать объект, мы также можем возвращать функции, значения и т. Д. Все, что мы вернем, будет доступно для экземпляра службы.

    Сервисная функция:

    Это другой способ, мы можем зарегистрировать услугу. Единственное различие заключается в том, как AngularJS пытается создать экземпляр объекта службы. На этот раз угловое использует ключевое слово «новое» и вызывает функцию-конструктор, как показано ниже.

    В функции конструктора мы можем использовать это ключевое слово для добавления свойств / методов в объект службы. пример:

    Функция поставщика:

    Функция Provider () — это другой способ создания сервисов. Позвольте нам заинтересовать создание сервиса, который просто отображает пользователю приветственное сообщение. Но мы также хотим предоставить такую ​​функциональность, чтобы пользователь мог установить собственное приветственное сообщение. В техническом плане мы хотим создать настраиваемые службы. Как мы можем это сделать ? Должен быть способ, чтобы приложение могло передавать свои собственные приветственные сообщения, а Angularjs сделает его доступным для функции factory / constructor, которая создаст наш экземпляр служб. В таком случае функция provider () выполняет задание. используя функцию provider (), мы можем создавать настраиваемые службы.

    Мы можем создавать настраиваемые службы, используя синтаксис поставщика, как указано ниже.

    Как внутренне работает синтаксис провайдера?

    Объект 1.Provider создается с использованием функции конструктора, определенной в нашей функции поставщика.

    2. Функция, которую мы передали в app.config (), выполняется. Это называется фазой конфигурации, и здесь у нас есть возможность настроить наш сервис.

    3. Завершить создание экземпляра службы путем вызова метода $ get serviceProvider.

    Пример кода для создания службы с использованием синтаксиса обеспечения:

    Резюме:

    Factory использует заводскую функцию, которая возвращает экземпляр службы. serviceInstance = fnFactory ();

    Служба использует функцию-конструктор, а функция «Угловая» вызывает эту конструкторскую функцию, используя ключевое слово «новое» для создания экземпляра службы. serviceInstance = new fnServiceConstructor ();

    Поставщик определяет функцию prov >

    Каковы различия между Service , Provider и Factory в AngularJS?

    Фабрика: на заводе вы фактически создаете объект внутри завода и возвращаете его.
    service: У вас есть стандартная функция, которая использует это ключевое слово для определения функции.
    провайдер: провайдер определяет $ get, который вы определяете, и его можно использовать для получения объекта, который возвращает данные.

    1.Услуги — это одиночные объекты, которые создаются при необходимости и никогда не очищаются до конца жизненного цикла приложения (когда браузер закрыт). Контроллеры уничтожаются и очищаются, когда они больше не нужны.

    2. Самый простой способ создания сервиса — использовать метод factory (). Метод factory () позволяет нам определить службу, возвращая объект, который содержит служебные функции и служебные данные. Функция определения услуги — это место, где мы размещаем наши инъекционные сервисы, такие как $ http и $ q. Пример:

    Использование фабрики () в нашем приложении

    Легко использовать завод в нашем приложении, так как мы можем просто вводить его там, где это необходимо во время выполнения.

    1. С другой стороны, метод service () позволяет нам создать сервис, определив функцию-конструктор. Мы можем использовать прототипный объект для определения нашего сервиса вместо необработанного объекта javascript. Подобно методу factory (), мы также установим инъекции в определение функции.
    2. Самый низкий способ создания службы — это использовать метод offer (). Это единственный способ создать сервис, который мы можем настроить с помощью функции .config (). В отличие от предыдущих методов, мы будем устанавливать инъекции в определенном определении. $ Get ().

    Мое понимание очень просто.

    Factory: вы просто создаете объект внутри фабрики и возвращаете его.

    Обслуживание:

    У вас есть стандартная функция, которая использует это ключевое слово для определения функции.

    Поставщик:

    Существует $get объект, который вы определяете, и его можно использовать для получения объекта, который возвращает данные.

    Давайте обсудим три способа обработки бизнес-логики в AngularJS простым способом: ( Вдохновленный курсом Yaakov Coursera AngularJS )

    СЕРВИС :

    app.js

    index.html

    1. Леновый Игнорируется : если он не вводится, он не будет создан. Поэтому для его использования придется вводить его в модуль.
    2. Singleton : если вы вводите несколько модулей, все будут иметь доступ только к одному конкретному экземпляру. Вот почему очень удобно обмениваться данными между разными контроллерами.

    ФАБРИКА

    Сначала давайте посмотрим на синтаксис:

    app.js :

    Теперь, используя вышеуказанные два в контроллере:

    1. Выполняет шаблон заводского проектирования. Завод является центральным местом, где производятся новые объекты или функции.
    2. Не только производит singleton, но и настраиваемые сервисы.
    3. Этот .service() метод является фабрикой, которая всегда производит один и тот же тип сервиса, который является одноэлементным, и без какого-либо простого способа настроить его поведение. Этот .service() метод обычно используется как ярлык для чего-то, что не требует какой-либо конфигурации.

    ПРОВАЙДЕР

    Давайте снова посмотрим на синтаксис:

    1. Поставщик — это самый гибкий метод создания сервисов в Angular.
    2. Мы не только можем создать фабрику, которая динамически настраивается, но на момент использования фабрики с использованием метода поставщика мы могли бы настраивать завод только один раз при загрузке всего нашего приложения.
    3. Затем завод может использоваться во всем приложении с пользовательскими настройками. Другими словами, мы можем настроить этот завод перед запуском приложения. Фактически в угловой документации упоминается, что метод провайдера — это то, что фактически выполняется за кулисами, когда мы настраиваем наши сервисы с помощью либо методов, .service либо .factory методов.
    4. $get Это функция , которая непосредственно присоединена к экземпляру поставщика. Эта функция является заводской . Другими словами, это так же , как тот , который мы используем , чтобы обеспечить к .factory методу. В этой функции мы создаем нашу собственную услугу. Это $get свойство, это функция, делает провайдера провайдером . AngularJS ожидает, что у провайдера будет свойство $ get, значение которого является функцией, которую Angular будет рассматривать как заводскую функцию. Но то, что делает эту настройку всего провайдера очень особенной, заключается в том, что мы можем предоставить некоторый config объект внутри поставщика услуг, и обычно это происходит с настройками по умолчанию, которые мы можем позже перезаписать на этом этапе, где мы можем настроить все приложение.

    Мое разъяснение по этому вопросу:

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

    Хотя глобальные переменные не рекомендуются, реальное использование этих глобальных переменных заключается в том, чтобы обеспечить инъекцию зависимостей , передав переменную соответствующему контроллеру.

    Существует множество уровней осложнений при создании значений для «глобальных переменных»:

    1. постоянная
      Это определяет фактическую константу, которая не должна быть изменена во время всего приложения, так же как и константы на других языках (что-то, чего не хватает JavaScript).
    2. Значение
      Это модифицируемое значение или объект, и оно служит некоторой глобальной переменной, которую можно даже вводить при создании других сервисов или фабрик (см. Далее). Однако это должно быть « буквальное значение », что означает, что нужно записать фактическое значение и не может использовать какую-либо логику вычисления или программирования (другими словами, 39 или myText или в порядке, но 2 + 2 — нет).
    3. Factory
      . Более общее значение, которое можно вычислить сразу. Он работает, передавая функцию AngularJS с логикой, необходимой для вычисления значения, и функция AngularJS выполняет ее, и она сохраняет возвращаемое значение в названной переменной.
      Обратите внимание, что можно вернуть объект (в этом случае он будет функционировать аналогично службе ) или функцию (которая будет сохранена в переменной как функция обратного вызова).
    4. обслуживание
      Служба является более урезанной версией фабрики, которая действительна только тогда, когда это значение является объектом, и позволяет записывать любую логику непосредственно в функции (как если бы это был конструктор), а также объявлять и получать доступ к свойства объекта, используя это ключевое слово.
    5. Поставщик
      В отличие от службы, которая является упрощенной версией фабрики , поставщик является более сложным, но более гибким способом инициализации «глобальных» переменных, причем наибольшей гибкостью является возможность устанавливать значения из app.config.
      Он работает как комбинация сервиса и поставщика , передавая провайдеру функцию, которая имеет свойства, объявленные с помощью этого ключевого слова, которые могут использоваться из app.config .
      Затем он должен иметь отдельную функцию $ .get, которая выполняется AngularJS после установки вышеуказанных свойств через app.config файл, и эта функция $ .get ведет себя так же, как и заводская выше, поскольку его возвращаемое значение используется для инициализации «глобальных» переменных.

    Как указано несколькими людьми здесь, фабрика, поставщик, сервис и даже ценность и константа являются версиями одного и того же. Вы можете проанализировать все более общее provider . Вот так:

    Все сервисы — это одиночные игры ; они получают экземпляр один раз за приложение. Они могут быть любого типа , будь то примитивный, объектный литерал, функция или даже экземпляр пользовательского типа.

    value , factory , service , constant и методы provider — все поставщики. Они учат инжектора, как создавать экземпляры Служб.

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

    • Рецепт Value — это самый простой случай, когда вы создаете экземпляр Сервиса самостоятельно и предоставляете инкрементированное значение инжектору.
    • Рецепт Factory дает инжектору заводскую функцию, которую он вызывает, когда требуется создать экземпляр службы. При вызове фабричная функция создает и возвращает экземпляр службы. Зависимости Службы вводятся как аргументы функций. Таким образом, использование этого рецепта добавляет следующие способности:
      • Возможность использования других сервисов (есть зависимости)
      • Инициализация службы
      • Отложенная / ленивая инициализация
    • Рецепт службы почти такой же, как и заводской рецепт, но здесь Инжектор вызывает конструктор с новым оператором вместо заводской функции.
    • Рецепт провайдера, как правило, излишний . Он добавляет еще один слой косвенности, позволяя вам настроить создание фабрики.

      Вы должны использовать рецепт поставщика только тогда, когда вы хотите открыть API для всей конфигурации приложения, которая должна быть выполнена до запуска приложения. Обычно это интересно только для многоразовых сервисов, поведение которых может немного меняться между приложениями.

      Уже есть хорошие ответы, но я просто хочу поделиться этим.

      Прежде всего: провайдер — это способ / рецепт создания service объекта (singleton), который, предположительно, должен быть введен инжектором $ (как AngulaJS идет о шаблоне IoC).

      И стоимость, фабрика, обслуживание и постоянное (4 способа) — синтаксический сахар над Provider путем / recepie.

      Есть Service vs Factory часть, которая была рассмотрена: https://www.youtube.com/watch?v=BLzNCkPn3ao

      Сервис — это все о new ключевом слове, которое, как мы знаем, имеет 4 вещи:

      1. создает новый объект
      2. связывает его с его prototype объектом
      3. подключается context к this
      4. и возвращает this

      А Factory — все о Factory Pattern — содержит функции, возвращающие объекты, подобные этой службе.

      1. способность использовать другие службы (имеют зависимости)
      2. инициализация сервиса
      3. отложенная / ленивая инициализация

      И это простое / короткое видео: охватывает также Prov >

      Рецепт поставщика используется в основном в конфигурации приложения, прежде чем приложение будет полностью запущено / инициализировано.

      Для меня лучший и самый простой способ понять разницу:

      Как AngularJS создает экземпляры определенных компонентов (упрощенных):

      Таким образом, для службы то, что становится компонентом AngularJS, является экземпляром объекта класса, который представлен функцией объявления объявления. Для фабрики это результат, возвращаемый функцией фабричной декларации. Завод может вести себя так же, как и сервис:

      Самый простой способ мышления следующий:

      • Сервис — экземпляр объекта singleton. Используйте службы, если вы хотите предоставить одноэлементный объект для своего кода.
      • Фабрика — это класс. Используйте фабрики, если вы хотите предоставить пользовательские классы для своего кода (не могут быть выполнены с помощью служб, поскольку они уже созданы).

      Пример «класс» фабрики приведен в комментариях, а также разница между поставщиками.

      Дополнительное разъяснение состоит в том, что фабрики могут создавать функции / примитивы, в то время как услуги не могут. Посмотрите этот jsFiddle на основе Epokk’s: http://jsfiddle.net/skeller88/PxdSP/1351/ .

      Заводская функция возвращает функцию, которая может быть вызвана:

      Завод также может возвращать объект с помощью метода, который можно вызвать:

      Служба возвращает объект с помощью метода, который может быть вызван:

      Для получения дополнительной информации см. Сообщение, которое я написал о различии: http://www.shanemkeller.com/tldr-services-vs-factories-in-angular/

      • Существует пять типов рецептов, которые определяют, как создавать объекты: Value , Factory , Service , Provider и Constant .
      • Фабрика и Сервис — наиболее часто используемые рецепты. Единственное различие между ними заключается в том, что рецепт службы лучше работает для объектов пользовательского типа, в то время как Factory может создавать примитивы и функции JavaScript.
      • Provider рецепт является основной тип рецепт и все остальные просто синтаксический сахар на нем.
      • Поставщик — самый сложный тип рецепта. Это вам не нужно, если вы не создаете многократно используемый код, который нуждается в глобальной конфигурации.

      Лучшие ответы от SO:

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

      Угловой предоставляет нам три способа создания и регистрации нашего собственного сервиса.

      Factory : фабрика — это простая функция, которая позволяет вам добавить некоторую логику перед созданием объекта. Он возвращает созданный объект.

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

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

      Это одноэлементный объект. Используйте его, когда вам нужно использовать один объект в приложении. Например, аутентифицированные данные пользователя.

      Поставщик . Поставщик используется для создания настраиваемого объекта службы. Он возвращает значение с помощью функции $ get ().

      Когда вам нужно предоставить модульную конфигурацию для своего объекта службы, прежде чем сделать ее доступной.

      Выполните следующий код и посмотрите результат.

      Просто для выяснения вещей, из источника AngularJS вы можете видеть, что служба просто вызывает заводскую функцию, которая, в свою очередь, вызывает функцию поставщика:

      Немного поздно на вечеринку. Но я подумал, что это более полезно для тех, кто хотел бы научиться (или иметь ясность) в разработке пользовательских сервисов Angular JS с использованием методологий фабрики, сервиса и поставщика.

      Я наткнулся на это видео, в котором четко разъясняются методологии фабрики, сервиса и провайдера для разработки пользовательских сервисов AngularJS:

      Код, размещенный здесь, скопирован прямо из вышеупомянутого источника, чтобы принести пользу читателям.

      Код для пользовательской службы на основе «фабрики» выглядит следующим образом (который идет как с версиями sync, так и с асинхронными версиями вместе с вызовом службы http):

      Код для «сервисной» методологии для пользовательских сервисов (это очень похоже на «заводская», но отличается от синтаксической точки зрения):

      Код для методологии «поставщик» для пользовательских сервисов (это необходимо, если вы хотите создать услугу, которая может быть настроена):

      Наконец, пользовательский интерфейс, который работает с любой из перечисленных служб:

      После прочтения всех этих сообщений это создало для меня больше смущения. Но все же все это заслуживает внимания. Наконец, я нашел следующую таблицу, которая даст информацию с простым сравнением

      • Инжектор использует рецепты для создания двух типов объектов: сервисов и объектов специального назначения
      • Существует пять типов рецептов, которые определяют, как создавать объекты: Value, Factory, Service, Provider и Constant.
      • Фабрика и Сервис — наиболее часто используемые рецепты. Единственное различие между ними заключается в том, что рецепт службы лучше работает для объектов пользовательского типа, в то время как Factory может создавать примитивы и функции JavaScript.
      • Рецепт провайдера — это основной тип рецепта, а все остальные — только синтаксический сахар.
      • Поставщик — самый сложный тип рецепта. Это вам не нужно, если вы не создаете многократно используемый код, который нуждается в глобальной конфигурации.
      • Все объекты специального назначения, за исключением Контроллера, определяются через заводские рецепты.

      И для начинающих понять: — Это может не исправить вариант использования, но на высоком уровне это то, что usecase для этих трех.

      1. Если вы хотите использовать в конфигурации углового модуля, функция должна быть создана как поставщик
      1. Ajax-вызов или сторонняя интеграция должна быть услугой .
      2. Для манипуляций с данными создайте его как фабрику

      Для основных сценариев фабрика и служба ведут себя одинаково.

      Понимание оборудования, услуг и поставщиков оборудования AngularJS

      Все они используются для совместного использования одноразовых объектов многократного использования. Это помогает делиться многократно используемым кодом между вашим приложением / различными компонентами / модулями.

      • Ленточный экземпляр — Угловая только создает экземпляр сервиса / фабрики, когда от него зависит компонент приложения.
      • Синглтоны. Каждый компонент, зависящий от службы, получает ссылку на единственный экземпляр, созданный фабрикой услуг.

      завод

      Фабрика — это функция, в которой вы можете манипулировать / добавлять логику перед созданием объекта, а затем вновь созданный объект возвращается.

      использование

      Это может быть просто набор функций, таких как класс. Следовательно, он может быть создан в разных контроллерах, когда вы вводите его внутри своих функций контроллера / фабрики / директивы. Он создается только один раз для каждого приложения.

      обслуживание

      Просто глядя на службы, подумайте о прототипе массива. Служба — это функция, которая создает новый объект с использованием ключевого слова «новое». Вы можете добавить свойства и функции к объекту службы, используя this ключевое слово. В отличие от фабрики, он ничего не возвращает (он возвращает объект, который содержит методы / свойства).

      использование

      Используйте его, когда вам нужно использовать один объект во всем приложении. Например, аутентифицированные данные пользователя, совместно используемые методы / данные, служебные функции и т. Д.

      поставщик

      Поставщик используется для создания настраиваемого объекта службы. Вы можете настроить параметры службы из функции конфигурации. Он возвращает значение с помощью функции $get() . Функция $get запускается на этапе запуска в угловом режиме.

      использование

      Когда вам нужно предоставить модульную конфигурацию для своего объекта службы, прежде чем сделать ее доступной, например. предположим, что вы хотите установить свой URL-адрес API на основе вашей среды, например dev , stage или prod

      Только поставщик будет доступен в фазе конфигурации угловой, в то время как сервис и завод — нет.

      Надеюсь, это прояснило ваше понимание о Factory, Service и Provider .

      TL; DR


      1) Когда вы используете Factory, вы создаете объект, добавляете к нему свойства, а затем возвращаете тот же объект. Когда вы передадите эту фабрику в ваш контроллер, эти свойства объекта будут доступны на этом контроллере через ваш завод.

      2) Когда вы пользуетесь сервисом , AngularJS копирует его за кулисы с помощью ключевого слова «новое». Из-за этого вы добавите свойства к «этому», и служба вернет «это». Когда вы передаете услугу в ваш контроллер, эти свойства на «этом» теперь будут доступны на этом контроллере через вашу службу.

      3) Провайдеры — это единственная услуга, которую вы можете передать в свою функцию .config (). Используйте поставщика, если вы хотите предоставить конфигурацию по всему модулю для своего объекта службы, прежде чем сделать его доступным.

      Non TL; DR

      1) Фабрика
      Фабрики — самый популярный способ создания и настройки сервиса. Там действительно не намного больше, чем TL, сказал DR. Вы просто создаете объект, добавляете к нему свойства, а затем возвращаете тот же объект. Затем, когда вы передадите фабрику в свой контроллер, эти свойства объекта будут доступны в этом контроллере через ваш завод. Ниже приведен более обширный пример.

      Теперь любые свойства, которые мы придаем «сервису», будут доступны нам, когда мы передадим «myFactory» в наш контроллер.

      Теперь добавим некоторые «частные» переменные в нашу функцию обратного вызова. Они не будут напрямую доступны из контроллера, но мы, в конечном итоге, настроим некоторые методы getter / setter на «службе», чтобы иметь возможность изменять эти «частные» переменные, когда это необходимо.

      Здесь вы заметите, что мы не привязываем эти переменные / функцию к «сервису». Мы просто создаем их для того, чтобы либо использовать, либо модифицировать их позже.

      • baseUrl — это базовый URL, который требуется API iTunes.
      • _artist — художник, которого мы хотим найти
      • _finalUrl — это окончательный и полностью созданный URL-адрес, по которому мы будем звонить в iTunes
      • makeUrl — это функция, которая создаст и вернет наш дружественный iTunes URL.

      Теперь, когда наши вспомогательные / частные переменные и функции находятся на месте, добавим некоторые свойства в объект «service». Независимо от того, что мы используем «сервис», можно напрямую использовать внутри любого контроллера, которому мы передаем «myFactory».

      Мы собираемся создавать методы setArtist и getArtist, которые просто возвращают или устанавливают исполнителя. Мы также создадим метод, который вызовет iTunes API с нашим созданным URL. Этот метод вернет обещание, которое будет выполнено после того, как данные вернутся из iTunes API. Если у вас не было большого опыта использования обещаний в AngularJS, я настоятельно рекомендую глубоко погрузиться в них.

      Ниже setArtist принимает художника и позволяет вам установить исполнителя. getArtist возвращает художника. callItunes сначала вызывает makeUrl (), чтобы создать URL-адрес, который мы будем использовать с нашим запросом $ http. Затем он создает объект обещания, делает запрос $ http с нашим окончательным URL-адресом, а потому, что $ http возвращает обещание, мы можем вызвать .success или .error после нашего запроса. Затем мы разрешаем наше обещание с данными iTunes или отклоняем его сообщением «Ошибка».

      Теперь наша фабрика завершена. Теперь мы можем ввести «myFactory» в любой контроллер, и тогда мы сможем вызвать наши методы, которые мы привязали к нашему объекту службы (setArtist, getArtist и callItunes).

      В контроллере выше мы вводим в службу «myFactory». Затем мы устанавливаем свойства на нашем объекте $ scope с данными из ‘myFactory’. Единственный сложный код, приведенный выше, заключается в том, что раньше вы никогда не сталкивались с обещаниями. Поскольку callItunes возвращает обещание, мы можем использовать метод .then () и устанавливать значение $ scope.data.artistData только после того, как наше обещание будет выполнено с данными iTunes. Вы заметите, что наш контроллер очень «тонкий» (это хорошая практика кодирования). Все наши логические и постоянные данные находятся в нашем сервисе, а не в нашем контроллере.

      2) Обслуживание
      Возможно, самое важное, что нужно знать при создании службы, это то, что она создается с помощью нового ключа. Для вас JavaScript-гуру это должно дать вам большой намек на природу кода. Для тех из вас, у кого ограниченный фон в JavaScript или для тех, кто не слишком хорошо знаком с тем, что на самом деле делает «новое» ключевое слово, давайте рассмотрим некоторые основы JavaScript, которые в конечном итоге помогут нам понять природу Сервиса.

      Чтобы действительно увидеть изменения, возникающие при вызове функции с ключевым словом «новое», давайте создадим функцию и вызовите ее с помощью «нового» ключевого слова, а затем давайте посмотрим, что делает интерпретатор, когда видит ключевое слово «новое». Конечные результаты будут одинаковыми.

      Сначала создадим наш конструктор.

      Это типичная функция JavaScript-конструктора. Теперь всякий раз, когда мы вызываем функцию Person с использованием ключевого слова «новое», «это» будет привязано к вновь созданному объекту.

      Теперь давайте добавим метод на прототип нашего Человека, чтобы он был доступен для каждого экземпляра класса Person.

      Теперь, поскольку мы помещаем функцию sayName в прототип, каждый экземпляр Person будет способен вызвать функцию sayName, чтобы предупредить имя этого экземпляра.

      Теперь, когда у нас есть функция конструктора Person и наша функция sayName на ее прототипе, давайте фактически создадим экземпляр Person, а затем вызовите функцию sayName.

      Таким образом, все вместе код для создания конструктора Person, добавление функции к его прототипу, создание экземпляра Person, а затем вызов функции на его прототипе выглядит так.

      Теперь давайте посмотрим, что на самом деле происходит, когда вы используете ключевое слово «новое» в JavaScript. Первое, что вы должны заметить, это то, что после использования «нового» в нашем примере мы можем вызвать метод (sayName) на «tyler», как если бы это был объект — это потому, что он есть. Итак, сначала мы знаем, что наш конструктор Person возвращает объект, можем ли мы видеть это в коде или нет. Во-вторых, мы знаем, что поскольку наша функция sayName находится на прототипе, а не непосредственно на экземпляре Person, объект, возвращаемый функцией Person, должен делегировать его прототипу при неудачном поиске. В более простых терминах, когда мы вызываем tyler.sayName (), интерпретатор говорит «ОК, я собираюсь посмотреть на объект« tyler », который мы только что создали, найти функцию sayName, а затем вызвать его. Подождите, я не вижу этого здесь — все, что я вижу, это имя и возраст, позвольте мне проверить прототип. Да, похоже, что это на прототипе, позвольте мне называть его ».

      Ниже приведен код для того, как вы можете думать о том, что на самом деле делает «новое» ключевое слово в JavaScript. Это в основном пример кода из приведенного выше параграфа. Я поставил «представление интерпретатора» или способ, которым интерпретатор видит код внутри заметок.

      Теперь, имея эти знания о том, что на самом деле делает «новое» ключевое слово в JavaScript, создание службы в AngularJS должно быть проще понять.

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

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

      Прежде всего, давайте создадим нашу «частную» и вспомогательную функцию. Это должно выглядеть очень хорошо, поскольку мы сделали то же самое с нашей фабрикой. Я не буду объяснять, что каждая строка делает здесь, потому что я сделал это на фабричном примере, если вы в замешательстве, перечитайте заводский пример.

      Теперь мы приложим все наши методы, которые будут доступны в нашем контроллере для «этого».

      Теперь, как на нашем заводе, setArtist, getArtist и callItunes будут доступны в любом контроллере, в который мы передаем myService. Вот контроллер myService (который почти точно совпадает с нашим заводским контроллером).

      Как я уже упоминал ранее, когда вы действительно понимаете, что такое «новое», службы почти идентичны фабрикам в AngularJS.

      3) Провайдер

      Самое важное, что нужно помнить о Провайдерах, это то, что они являются единственным сервисом, который вы можете передать в часть приложения app.config. Это имеет огромное значение, если вам нужно изменить часть своего объекта службы, прежде чем он будет доступен везде в вашем приложении. Хотя они очень похожи на сервисы / фабрики, есть несколько различий, которые мы обсудим.

      Сначала мы создали наш Поставщик так же, как и с нашим Сервисом и Фабрикой. Переменные ниже — наша «частная» и вспомогательная функция.

      * Опять же, если какая-либо часть вышеуказанного кода запутывает, проверьте раздел Factory, где я объясню, что все это делает более подробными.

      Вы можете думать, что у Провайдеров есть три раздела. Первый раздел — это «частные» переменные / функции, которые будут изменены / установлены позже (показано выше). Второй раздел — это переменные / функции, которые будут доступны в вашей функции app.config и поэтому доступны для изменения до того, как они будут доступны где-нибудь еще (также показано выше). Важно отметить, что эти переменные необходимо привязать к ключевому слову «this». В нашем примере в app.config будет доступно только «thingFromConfig». Третий раздел (показано ниже) — это все переменные / функции, которые будут доступны в вашем контроллере, когда вы передадите услугу «myProvider» в этот конкретный контроллер.

      При создании службы с провайдером единственными свойствами / методами, которые будут доступны в вашем контроллере, являются те свойства / методы, которые возвращаются из функции $ get (). Код ниже ставит $ get на ‘this’ (который, как мы знаем, в конечном итоге будет возвращен из этой функции). Теперь эта функция $ get возвращает все методы / свойства, которые мы хотим получить в контроллере. Вот пример кода.

      Теперь полный код провайдера выглядит так:

      Теперь, как на нашем заводе и в сервисе, setArtist, getArtist и callItunes будут доступны в любом контроллере, в который мы передаем myProvider. Вот контроллер myProvider (который почти такой же, как и наш заводский / сервисный контроллер).

      Как уже упоминалось ранее, цель создания службы с провайдером заключается в том, чтобы иметь возможность изменять некоторые переменные с помощью функции app.config до того, как конечный объект будет передан остальной части приложения. Давайте посмотрим на пример.

      Теперь вы можете видеть, как «thingFromConfig» является пустой строкой в ​​нашем провайдере, но когда это отображается в DOM, это будет «Это предложение было установлено . ».

      Все хорошие ответы уже есть. Я хотел бы добавить еще несколько пунктов на Service and Factory . Наряду с разницей между сервисом / фабрикой. И у вас также могут быть такие вопросы, как:

      1. Должен ли я использовать сервис или завод? Какая разница?
      2. Являются ли они такими же или имеют одинаковое поведение?

      Давайте начнем с разницы между Сервисом и фабрикой:

      Оба являются Singletons : всякий раз, когда Angular находит это как зависимость в первый раз, он создает единый экземпляр сервиса / фабрики. Когда экземпляр создается, тот же экземпляр используется навсегда.

      Может использоваться для моделирования объекта с поведением : они могут иметь как методы, так и внутренние переменные состояния и т. Д. Хотя способ записи этого кода будет отличаться.

      Сервисы:

      Служба — это функция-конструктор, и Угловая будет создавать ее, вызывая новое yourServiceName() . Это означает пару вещей.

      1. Функции и переменные экземпляра будут свойствами this .
      2. Вам не нужно возвращать значение. Когда Угловые вызовы new yourServiceName( ), он получит this объект со всеми свойствами, которые вы на нем наложили.

      Когда Angular вводит эту MyService услугу в контроллер, который зависит от нее, этот контроллер получит то, на MyService что он может вызывать функции, например MyService.aServiceMethod ().

      Будьте осторожны this :

      Поскольку построенная служба является объектом, методы внутри нее могут ссылаться на это при их вызове:

      Возможно ScoreKeeper.setScore , у вас возникнет соблазн позвонить в цепочку обещаний, например, если вы инициализировали счет, захватив его с сервера: $http.get(‘/score’).then(ScoreKeeper.setScore). проблема в том, что ScoreKeeper.setScore он будет вызван с this привязкой, null и вы получите ошибки. Лучший способ был бы $http.get(‘/score’).then(ScoreKeeper.setScore.bind(ScoreKeeper)) . Если вы решите использовать это в своих методах обслуживания или нет, будьте осторожны, как вы их называете.

      Возврат значения из a Service :

      Из-за того, как работают JavaScript-конструкторы, если вы возвращаете комплексное значение (ie, an Object) из constructor функции, вызывающий объект получит этот объект вместо этого экземпляра.

      Это означает, что вы можете в основном скопировать-вставить заводский пример снизу, заменить factory на service , и он будет работать:

      Поэтому, когда Angular создает ваш сервис с помощью нового MyService (), он получит этот объект api вместо экземпляра MyService.

      Это поведение для любых сложных значений (объектов, функций), но не для примитивных типов.

      Фабрики:

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

      Введенное значение для заводской зависимости — это возвращаемое значение фабрики, и оно не обязательно должно быть объектом. Это может быть функция

      Ответы на выше 1 и 2 вопроса:

      По большей части, просто придерживайтесь использования заводов для всего. Их поведение легче понять. Невозможно решить, нужно ли возвращать значение или нет, и, кроме того, нет ошибок, которые будут введены, если вы поступите неправильно.

      Тем не менее, я по-прежнему отношусь к ним как к «службам», когда я говорю о том, чтобы вводить их в качестве зависимостей.

      Сервис / поведение фабрики очень похоже, и некоторые люди скажут, что один из них в порядке. Это несколько верно, но мне легче следовать совету руководства по стилю Джона Папы и просто придерживаться фабрик. **

      Я заметил что-то интересное, играя с провайдерами.

      Видимость инъекционных препаратов различна для поставщиков, чем для служб и заводов. Если вы объявляете константу AngularJS (например, myApp.constant(‘a’, ‘Robert’); ), вы можете вводить ее в службы, фабрики и провайдеры.

      Но если вы объявляете «значение» AngularJS (например. myApp.value(‘b’, ); ), Вы можете вводить его в сервисы и фабрики, но НЕ в функцию создания провайдера. Однако вы можете ввести его в $get функцию, которую вы определяете для своего провайдера. Это упоминается в документации AngularJS, но ее легко пропустить. Вы можете найти его на странице% предоставления в разделах по значениям и постоянным методам.

      Этот ответ касается темы / вопроса

      как Factory, Service и Constant — всего лишь синтаксический сахар поверх рецепта поставщика?

      ИЛИ ЖЕ

      как фабрика, сервис и провайдеры

      в основном, что происходит

      Когда вы делаете factory() это, вы устанавливаете, что вы function предоставили второй аргумент поставщику $get и возвращаете его ( provider(name, <$get:factoryFn >) ), все, что вы получаете, provider но нет другого свойства / метода, кроме $get этого provider (означает, что вы не можете его настроить)

      Исходный код завода

      Когда service() вы возвращаете его, вы предоставляете фабрику (), function которая вводит constructor (возвращает экземпляр конструктора, который вы указали в своей службе), и возвращает его

      Исходный код службы

      Таким образом, в основном в обоих случаях вы в конечном итоге получаете провайдеров $ get для вашей функции, которую вы предоставили, но вы можете предоставить что-либо дополнительно, чем $ get, поскольку вы можете первоначально предоставить в provider () для блока конфигурации

      Это очень запутанная часть для новичков, и я попытался прояснить это простыми словами

      Служба AngularJS: используется для совместного использования служебных функций с помощью служебной ссылки в контроллере. Служба является одноточечной, поэтому для одной службы в браузере создается только один экземпляр, и на всей странице используется одна и та же ссылка.

      В службе мы создаем имена функций как свойство с этим объектом.

      Угловая фабрика: цель Factory также та же, что и Сервис, но в этом случае мы создаем новый объект и добавляем функции в качестве свойств этого объекта, а в конце мы возвращаем этот объект.

      Поставщик AngularJS: цель этого снова такая же, однако провайдер дает результат своей функции $ get.

      Используя ссылку на эту страницу и docs.angularjs.org/guide/providers (которая, кажется, значительно улучшилась с тех пор, как я смотрел в последний раз), я собрал следующую реальную демо-версию (-ish), в которой используются 4 из 5 вкусов провайдера; Value, Constant, Factory и полнофункциональный поставщик.

      HTML:

      приложение

      завод

      Вы предоставляете функцию AngularJS, AngularJS будет кэшировать и вводить возвращаемое значение при запросе фабрики.

      обслуживание

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

      поставщик

      Вы предоставляете функцию AngularJS, и функция AngularJS будет вызывать ее $get функцию. Это возвращаемое значение из $get функции, которая будет кэшироваться и вводиться, когда запрашивается услуга.

      Провайдеры позволяют вам настроить поставщика, прежде чем AngularJS $get вызовет метод для получения инъекции.

      Использование (в виде инъекции в контроллер)

      Использование (настройка провайдера перед $get вызовом для создания инъекционного)

      # 30 Тестируем фабрики в AngularJS

      Всем привет. В этом уроке мы с вами разберем, как тестировать фабрики в AngularJS. Для рана тестов я предпочитаю использовать karma runner. Для начала, его нужно установить глобально с помощью команды

      Это поставит пакет karma-cli глобально. Теперь нам нужно сгенерировать файл конфигурации. Для этого напишем

      Это запустит процесс создания файла. Нам нужно ответить на ряд вопросов.

      1. Мы будем использовать jasmine
      2. requireJS нам не нужен
      3. использовать мы будем Chrome
      4. как исходные файлы мы будем использовать js/*.js.
      5. как файлы текста мы будем использовать test/**/*Spec.js
      6. не эксклудим никакие файлы
      7. да мы хотим, чтобы карма вотчила все изменения

      Теперь, как мы видим у нас появился файл karma.conf. Так указаны все данные, которые мы ввели.

      Теперь давайте создадим папку js и в ней файл main.js

      Мы создали наш app без зависимостей. Описали фабрику playlist, которая содержит name и метод, getTracks, который возвращает список треков. Трека у нас статический.

      Теперь создадим папку test и в ней файл mailSpec.js. Помните, что наш паттерн для поиска файлов *.Spec, поэтому, если мы не напишем Spec в названии, то файл оно не найдет.

      Если вы работали раньше с jasmine, вы должны знать такие слова как describe и it. Describe нам необходим для того, чтобы несколько тестов обьединять в один блок, а it нам нужен для конкретного теста.

      Это будет наш главный блок describe, в котором у нас будут идти тесты.

      Теперь давайте инициализируем наш app и заинджектим в него factory. Для этого нам поможет beforeEach. Это специальная функция, которая выполняется перед каждым тестом

      module(‘app’) — это модуль, который будет инициализирован. Inject же, помогает нам заинджектить фабрику в наш playlist. Для того, чтобы он нам был доступен в всех тестах инджектим его вот таким образом. Переменная playlist нам доступна в всех тестах.

      Теперь давайте напишем

      Запустим наши тесты

      Вот стартанул браузер и пишет

      Это логично, поскольку angular мы не добавили в karma.conf. У меня есть папка vendor и в ней лежать 2 файла — angular.js и angular-mocks.js. Давайте подключим их в раздел files в конфиг кармы. Первым нужно подключать angular, так как без него не будет работать angular-mocks.

      Зачем нам angular-mocks? Он помогает нам использовать такие функции, как module, inject, которые нам здесь доступны.

      Давайте запустим karma start еще раз. Как мы видим, тесты у нас запустились и у нас есть ошибка, так как 2 не равняется 1.

      Теперь давайте напишем тест, который будет проверять, что у фабрики сейчас корректное имя.

      Сначала сделаем, чтобы наш тест упал. Как мы видим, у нас видит вотчер. Это вотчер кармы, и все тесты сразу же перезапускаются.

      Это как раз нам и показывает, что у нас отлично заинджектился playlist в наш app. Давайте исправим тест, чтобы он прошел.

      И мы видим, что наш тест прошел.

      Теперь точно так же мы можем протестить, что функция getTracks возвращает нам правильный список треков.

      Как мы видим, теперь у нас тест падает.

      Давайте скопируем массив и сделаем, чтобы тест прошел.

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

      Как мы видим, karma проверяет все наши изменения при сохранении. Тестировать фабрики в angular достаточно просто, мы карму дольше настраивали, чем тесты писали. Karma, сама по себе, позволяет ранить любые тесты, хоть для директив, хоть для контроллеров.

      В следующем уроке мы разберем как мокать зависимости для того, чтобы тестировать ее изолировано.

      AngularJS: Когда использовать сервис вместо фабрики

      Пожалуйста, потерпите меня здесь. Я знаю, что есть другие ответы, такие как: AngularJS: Сервис против провайдера против фабрики

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

      Из того, что я могу сказать, фабрика обычно используется для создания «общих» функций, которые могут вызываться несколькими контроллерами: Создание общих функций контроллера

      Документы Angular, похоже, предпочитают заводские, а не сервисные. Они даже ссылаются на «сервис», когда используют фабрику, что еще более запутанно! http://docs.angularjs.org/guide/dev_guide.services.creating_services

      Так когда же можно будет использовать сервис?

      Есть ли что-то, что только возможно или намного проще сделать с помощью сервиса?

      Есть что-нибудь другое, что происходит за кулисами? Различия производительности/памяти?

      Вот пример. Кроме метода объявления, они кажутся идентичными, и я не могу понять, почему я сделал бы одно против другого. http://jsfiddle.net/uEpkE/

      Обновление: Из ответа Томаса, похоже, подразумевается, что сервис предназначен для более простой логики и фабрики для более сложной логики с закрытыми методами, поэтому я обновил код скрипты ниже, и кажется, что оба способны поддерживать частные функции?

      Объяснение

      Здесь есть разные вещи:

      Первый:

      • Если вы используете сервис, вы получите экземпляр функции (ключевое слово » this «).
      • Если вы используете фабрику, вы получите возвращаемое значение, вызвав ссылку на функцию (оператор return в фабрике).

      Второе:

      Имейте в виду, что все провайдеры в AngularJS (стоимость, константа, услуги, фабрики) являются одиночками!

      Третье:

      Использование одного или другого (сервис или фабрика) о стиле кода. Но общий способ в AngularJS — это использование фабрики .

      Потому что «Фабричный метод является наиболее распространенным способом получения объектов в систему внедрения зависимостей AngularJS. Он очень гибкий и может содержат сложную логику создания. Поскольку фабрики являются обычными функциями, мы также можем воспользоваться новой лексической областью для моделирования «частных» переменных. Это очень полезно, поскольку мы можем скрыть детали реализации данного сервиса. «

      Использование

      Служба: Может быть полезна для совместного использования служебных функций, которые полезно вызывать, просто добавляя () в ссылку на введенную функцию. Также может быть запущен с injectedArg.call(this) или подобным.

      Factory: Может быть полезно для возврата функции «class», которая затем может быть новой для создания экземпляров.

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

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

      Но я думаю, что со временем вы увидите, что будете использовать фабрику в 80% случаев.

      ОБНОВЛЕНИЕ:

      «Если вы хотите, чтобы ваша функция вызывалась как обычная функция , используйте factory . Если вы хотите, чтобы ваша функция создавалась с помощью нового оператора, используйте сервис. Если вы не знаете разницу, используйте фабрику. «

      ОБНОВЛЕНИЕ:

      Команда AngularJS выполняет свою работу и дает объяснения: http://docs.angularjs.org/guide/providers

      И с этой страницы:

      «Фабрика и Сервис — наиболее часто используемые рецепты. Единственное отличие между ними состоит в том, что Сервисный рецепт работает лучше для объектов пользовательского типа, тогда как Фабрика может создавать примитивы и функции JavaScript».

      allernhwkim первоначально опубликовано ответ по этому вопросу ссылка на его блог , однако модератор удалил его. Это единственный пост, который я нашел, который не только говорит вам, как сделать то же самое с сервисом, провайдером и фабрикой, но также рассказывает, что вы можете сделать с провайдером, чего не можете с фабрикой, и с завод, который вы не можете с обслуживанием.

      Прямо из его блога:

      Это показывает, как CarService всегда будет производить автомобиль с 4 цилиндрами, вы не можете изменить его для отдельных автомобилей. Принимая во внимание, что CarFactory возвращает функцию, чтобы вы могли выполнять new CarFactory в своем контроллере, передавая количество цилиндров, характерных для этой машины. Вы не можете сделать new CarService , потому что CarService — это объект, а не функция.

      Фабрики причины не работают так:

      И автоматически возвращать функцию, которую вы хотите создать, потому что тогда вы не можете сделать это (добавить вещи в прототип/etc):

      Посмотрите, как это буквально завод по производству автомобилей.

      Вывод из его блога довольно хорош:

      Используйте Service, когда вам нужен простой объект, такой как Hash, например, Код легко написать, но вы не можете создать его экземпляр.

      Используйте Factory, когда вам нужно создать экземпляр объекта, то есть new Customer (), new Comment () и т.д.

      Используйте провайдера, когда вам нужно его настроить. то есть тестовый URL, QA URL, производственный URL.

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

      Используйте сервис вместо:

      Концепция всех этих провайдеров намного проще, чем кажется на первый взгляд. Если вы рассекаете поставщика и вынимаете разные части, это становится очень ясным.

      Проще говоря, каждый из этих поставщиков является специализированной версией другого в следующем порядке: provider > factory > value / constant / service .

      До тех пор, пока провайдер делает все возможное, вы можете использовать провайдера дальше по цепочке, что приведет к написанию меньшего количества кода. Если он не выполняет то, что вы хотите, вы можете пойти вверх по цепочке, и вам просто нужно написать больше кода.

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

      Для получения более подробной информации и примеров из поста в блоге, где я получил изображение, перейдите по адресу: http://www.simplygoodcode.com/2015/11/the-difference-between-service-provider-and-factory- в-angularjs /

      И фабрика, и сервис приводят к созданию одноэлементных объектов, которые могут настраиваться поставщиками и вводиться в контроллеры и блоки выполнения. С точки зрения инженера, нет абсолютно никакой разницы, поступил ли объект с фабрики или из службы.

      Итак, когда использовать фабрику, а когда использовать сервис? Это сводится к вашему предпочтению кодирования, и ничего больше. Если вам нравится модульный шаблон JS, то идите на завод. Если вам нравится стиль функции конструктора («class»), тогда переходите на сервис. Обратите внимание, что оба стиля поддерживают закрытые члены.

      Преимущество службы может заключаться в том, что она является более интуитивной с точки зрения OOP: создайте «класс» и, совместно с поставщиком, повторно используйте один и тот же код в разных модулях и измените поведение создаваемые объекты просто предоставляя различные параметры конструктору в блоке конфигурации.

      Даже когда они говорят, что все сервисы и фабрики одноразовые, я не согласен на 100% с этим. Я бы сказал, что фабрики — это не одиночки, и в этом смысл моего ответа. Я бы действительно подумал об имени, которое определяет каждый компонент (Service/Factory), я имею в виду:

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

      Между тем, service является одиночным, поэтому мы можем создать только 1 из них, может быть, не создавать, но у нас есть только 1 экземпляр, когда мы внедряем в контроллер, поэтому сервис больше похож на обычный сервис ( остальные вызовы, функционал ..) к контролерам.

      Концептуально вы можете думать, как сервисы предоставляют сервис, фабрики могут создавать несколько экземпляров (объектов) класса

      Фабрика не может ничего сделать или сделать лучше по сравнению с Сервисом. И наоборот. Фабрика просто кажется более популярной. Причиной этого является удобство работы с частными/публичными членами. Сервис будет более неуклюжим в этом отношении. При кодировании Сервиса вы стремитесь сделать ваши члены объекта публичными с помощью ключевого слова «this» и можете внезапно обнаружить, что эти открытые члены не видны частным методам (то есть внутренним функциям).

      Angular использует ключевое слово «new» для создания службы для вас, поэтому экземпляр Angular, передаваемый контроллеру, будет иметь тот же недостаток. Конечно, вы можете преодолеть проблему, используя это/что:

      Но с большой константой Service это может сделать код плохо читаемым. Более того, прототипы Сервиса не будут видеть приватных участников — им будут доступны только публичные:

      Подводя итог, использовать Фабрику удобнее. Так как у Factory нет этих недостатков. Я бы порекомендовал использовать его по умолчанию.

      услуги

      синтаксис: module.service (‘имя_службы’, функция); Результат: При объявлении serviceName в качестве вводимого аргумента вам будет предоставлена ​​фактическая ссылка на функцию, переданную в module.service.

      Использование: Может быть полезно для совместного использования служебных функций, которые полезно вызывать, просто добавляя () к ссылке на введенную функцию. Также может быть запущен с помощью injectedArg.call (this) или аналогичным.

      заводы

      синтаксис: module.factory (‘factoryName’, функция);

      Результат: При объявлении factoryName в качестве вводимого аргумента вам будет предоставлено значение, возвращаемое путем вызова ссылки на функцию, переданной в module.factory.

      Использование: Может быть полезно для возврата функции ‘class’, которая затем может быть новой для создания экземпляров.

      Провайдеры

      синтаксис: module.provider (‘providerName’, функция);

      Результат: При объявлении providerName в качестве вводимого аргумента вам будет предоставлено значение, возвращаемое путем вызова метода $ get ссылки на функцию, переданной в module.provider.

      Использование: Может быть полезно для возврата функции ‘class’, которая затем может быть new’ed для создания экземпляров, но которая требует некоторой конфигурации перед вводом. Возможно, полезно для классов, которые можно использовать в разных проектах? Все еще немного смутно на этом.

      Фабрика и Сервис — наиболее часто используемый метод. Единственная разница между ними заключается в том, что метод Service работает лучше для объектов, которым требуется иерархия наследования, тогда как Factory может создавать примитивы и функции JavaScript.

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

      Существует пять способов создания сервисов: Value, Factory, Service, Provider и Constant. Вы можете узнать больше об этом здесь angular service , эта статья объясняет все эти методы на практических демонстрационных примерах.

      Можно использовать оба так, как вы хотите: будь создать объект или j только для доступа к функциям из обоих

      Вы можете создать новый объект из сервиса

      • сервис по умолчанию возвращает объект, а не функцию конструктора.
      • Вот почему для функции конструктора установлено свойство this.model.
      • Благодаря этому сервис вернет объект, но только внутри этого объекта будет функция конструктора, которая будет использоваться для создания нового объекта;

      Вы можете создать новый объект с фабрики

      • фабрика по умолчанию возвращает функцию конструктора, а не объект.
      • Вот почему новый объект может быть создан с помощью функции конструктора.

      Создать сервис для простого доступа к простым функциям

      Создать фабрику для простого доступа к простым функциям

      • вы можете использовать оба так, как вы хотите для создания нового объекта или просто для доступа к простым функциям
      • Там не будет никакого снижения производительности, используя один над другим
      • Оба являются одноэлементными объектами, и для каждого приложения создается только один экземпляр.
      • Будучи только одним экземпляром каждый раз, когда передается их ссылка.
      • В angular документации фабрика называется сервисом, а также сервис называется сервисом.

      AngularJS: когда использовать обслуживание вместо фабрики

      пожалуйста, потерпите меня здесь. Я знаю, что есть и другие ответы, такие как: AngularJS: сервис против поставщика против фабрики

      однако я все еще не могу понять, когда вы будете использовать сервис над фабрикой.

      из того, что я могу сказать, фабрика обычно используется для создания «общих» функций, которые могут быть вызваны несколькими контроллерами:создание общих функций контроллера

      угловые документы, похоже, предпочитайте фабрику над обслуживанием. Они даже ссылаются на «обслуживание» когда они используют фабрику которая даже более запутанна! http://docs.angularjs.org/guide/dev_guide.services.creating_services


      Итак, когда можно использовать сервис?

      есть ли что-то, что возможно или намного проще сделать с помощью сервиса?

      есть ли что-то другое, что происходит за кулисами? Различия в производительности / памяти?

      вот пример. Кроме метода объявления, они кажутся идентичными, и я не могу понять, почему я делаю одно против другого. http://jsfiddle.net/uEpkE/

      обновление: из ответа Томаса, похоже, следует, что сервис предназначен для более простой логики и фабрики для более сложной логики с частными методами, поэтому я обновил код скрипки ниже, и кажется, что оба могут поддерживать частные функции?

      8 ответов

      объяснение

      у вас здесь разные вещи:

      первый:

      • если вы используете услугу, вы получите экземпляр функции (» this » ключевое слово.)
      • если вы используете фабрику, вы получите значение, возвращаемое вызов ссылки на функцию (оператор возврата на заводе).

      второй:

      имейте в виду, что все поставщики в AngularJS (value, constant, services, factories) являются синглетами!

      третий:

      использование одного или другого (service или factory) — это стиль кода. Но . —8распространенным способом в AngularJS использовать завод.

      , потому что «метод фабрики наиболее распространенный способ получения объектов в систему впрыска зависимостей AngularJS. Он очень гибкий и может содержать сложную логику создания. Поскольку фабрики являются регулярными функциями, мы также можем воспользоваться новой лексической областью для имитации «частных» переменных. Это очень полезно, Так как мы можем скрыть детали реализации данной службы.»

      использование

      сервис : может быть полезно для совместного использования функций утилиты, которые полезно вызывать, просто добавляя () к введенной ссылке функции. Также можно запустить с помощью injectedArg.call(this) или аналогичные.

      Фабрика : может быть полезно для возврата функции «class», которая затем может быть new’ed для создания экземпляры.

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

      в других случаях если вы хотите вернуть экземпляр службы, просто используйте service.

      но вы увидите со временем, что вы будете использовать завод в 80% случаев, я думаю.

      обновление :

      «если вы хотите, чтобы ваша функция быть вызванным как нормальная функция используйте завод. Если вы хотите, чтобы ваша функция была создана с помощью new оператор, воспользуйтесь услугой. Если вы не знаете разницы, используйте factory.»

      обновление :

      команда AngularJS делает свою работу и дает объяснение: http://docs.angularjs.org/guide/providers

      и с этой страницы:

      «Фабрика и обслуживание наиболее обыкновенно используемые рецепты. Единственное различие между ними заключается в том, что Service recipe лучше работает для объектов пользовательского типа, в то время как Фабрика может производить примитивы и функции JavaScript.»

      allernhwkim цитата ответ по этому вопросу ссылка на блог, однако модератор удалил его. Это единственный пост, который я нашел, который не просто говорит вам, как сделать то же самое с сервисом, поставщиком и фабрикой, но также говорит вам, что вы можете сделать с поставщиком, что вы не можете с фабрикой, и с фабрикой, что вы не можете с сервисом.

      прямо из его блог:

      этот показывает, как CarService всегда будет производить автомобиль с 4 цилиндрами, вы не можете изменить его для отдельных автомобилей. В то время как CarFactory возвращает функцию, чтобы вы могли сделать new CarFactory в вашем контроллере, проходя в ряде цилиндров, характерных для этого автомобиля. Ты не можешь этого сделать!—7 потому что CarService-это объект, а не функция.

      причина, по которой фабрики не работают так:

      и автоматически возвращает функцию для создания экземпляра, потому что тогда вы не можете этого сделать это (добавьте вещи в прототип / etc):

      посмотрите, как это буквально завод, производящий автомобиль.

      вывод из его блога довольно хорош:

      Используйте сервис, когда вам нужен простой объект, такой как хэш, для пример это легко кодировать, но вы не можете создать экземпляр он.

      используйте фабрику когда вам нужно создаю объект, я.новый Клиент (), новый комментарий () и т. д.

      провайдер использовать, когда вам нужно настроить его. т. е. проверить URL-адрес, URL-адрес, ОК, производство url-адрес.

      если вы обнаружите, что просто возвращаете объект на заводе, вы, вероятно, должны использовать сервис.

      Не делайте этого:

      вместо этого используйте сервис:

      концепция для всех этих поставщиков намного проще, чем кажется изначально. Если вы препарируете провайдера и вытаскиваете разные части, это становится очень ясно.

      проще говоря, каждый из этих поставщиков является специализированной версией другого, в следующем порядке: provider > factory > value / constant / service .

      пока поставщик делает то, что вы можете, вы можете использовать поставщика дальше по цепочке, что приведет к написанию меньше кода. Если это не выполняет то, что вы хотите, вы можете подняться по цепочке, и вам просто нужно написать больше кода.

      Это изображение иллюстрирует, что я имею в виду, в этом изображении вы увидите код для поставщика, с выделенными частями, показывающими вам, какие части поставщика могут быть использованы для создания фабрики, значения и т. д.

      для получения более подробной информации и примеров из сообщения в блоге, где я получил изображение от go to: http://www.simplygoodcode.com/2015/11/the-difference-between-service-provider-and-factory-in-angularjs/

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

      Итак, когда использовать фабрику, и когда использовать услугу? Это сводится к вашему предпочтению кодирования, и ничего больше. Если вам нравится модульный шаблон JS, перейдите на завод. Если вам нравится затем стиль функции конструктора («класс») переходит к сервису. Обратите внимание, что оба стиля поддерживают частные члены.

      преимущество службы может заключаться в том, что она более интуитивно понятна с точки зрения ООП: создайте «класс» и совместно с поставщиком повторно используйте один и тот же код между модулями и изменяйте поведение создаваемых объектов, просто предоставляя различные параметры конструктору в блоке конфигурации.

      нет ничего, что фабрика не может сделать или делает лучше по сравнению с сервисом. И наоборот. Фабрика просто кажется более популярной. Причиной этого является его удобство в обращении с частными / публичными членами. В этой связи все более топорно. При кодировании службы вы, как правило, делаете свои члены объекта общедоступными с помощью ключевого слова «this» и можете внезапно обнаружить, что эти открытые члены не видны частным методам (т. е. внутренним функциям).

      Угловое использует ключевое слово » new » для создания службы для вас, поэтому угловые передачи экземпляра контроллеру будут иметь тот же недостаток. Конечно, вы можете преодолеть проблему, используя это/это:

      но с большой константой обслуживания это\that-ing сделало бы код плохо читаемым. Более того, прототипы сервиса не будут видеть частных участников – им будут доступны только публичные:

      суммировать его, используя фабрику более удобен. Как фабрика делает не имеют этих недостатков. Я бы рекомендовал использовать его по умолчанию.

      даже когда они говорят, что все службы и фабрики являются синглтонами, я не согласен с этим на 100 процентов. Я бы сказал, что фабрики не являются синглетами, и в этом суть моего ответа. Я бы действительно подумал о названии, которое определяет каждый компонент(сервис / Фабрика), я имею в виду:

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

      тем временем a сервис является синглтоном, поэтому мы можем создать только 1 вид, может быть, не создавать, но у нас есть только 1 экземпляр, когда мы inject в контроллере, поэтому служба предоставляет больше похожую на общую службу (вызовы rest, функциональность.. ) контроллерам.

      концептуально вы можете думать, как услуги предоставляют услугу, фабрики могут создавать несколько экземпляров (объектов) класса

      услуги

      синтаксис: модуль.service (‘serviceName’, функция ); результат: при объявлении serviceName в качестве вводимого аргумента вам будет предоставлена фактическая ссылка на функцию, переданная модулю.услуга.

      использование: может быть полезно для совместного использования функций утилиты, которые полезно вызывать, просто добавляя () к ссылке введенной функции. Может также работать с injectedArg.звоните () или подобный.

      фабрики

      синтаксис: модуль.фабрика( ‘factoryName’, функция );

      результат: при объявлении factoryName в качестве вводимого аргумента вам будет предоставлено значение, которое возвращается путем вызова ссылки на функцию, переданную модулю.фабрика.

      использование: может быть полезно для возврата функции «class», которая затем может быть new’ed для создания экземпляры.

      поставщики

      синтаксис: модуль.provider (‘providerName’, функция );

      результат: при объявлении providerName в качестве вводимого аргумента вам будет предоставлено значение, возвращаемое путем вызова метода $get ссылки на функцию, переданной модулю.поставщик.

      использование: может быть полезно для возврата функции «class», которая затем может быть new’ed для создания экземпляров но это требует какой-то конфигурации перед инъекцией. Возможно, полезно для классов, которые повторно используются в проектах? Все еще как в тумане.

      можно использовать как как хочешь : ли создать объект илиust для доступа к функциям как

      вы можете создать новый объект из сервиса

      • service по умолчанию возвращает объект, а не функцию конструктора .
      • так вот почему функция конструктора установлена на это.свойство модели.
      • из-за этого сервис вернет объект, но внутри этого объекта будет функция конструктора, которая будет использоваться для создания нового объекта;

      вы можете создать новый объект из Фабрики

      • factory по умолчанию возвращает функцию конструктора, а не объект.
      • так вот почему новый объект может быть создан с помощью функции конструктора.

      создать сервис для простого доступа к простым функциям

      создать фабрику для простого доступа к простым функциям

      • можно использовать как хочешь Создавать ли новый объект или просто для доступа к простым функциям
      • не будет никакого хита производительности, используя один над другим
      • оба синглтон объекты и только один экземпляр создается для каждого приложения.
      • будучи только одним экземпляром каждый, где их ссылка передается.
      • в угловой документации фабрика вызвана обслуживанием и сервис называется сервис.

      angularjs Смутно о Сервисе и Фабрике

      angular 5 title (18)

      Для краткого и простого объяснения см. https://stackoverflow.com/a/26924234/5811973 .

      Для подробного объяснения см. https://stackoverflow.com/a/15666049/5811973 .

      Также из документации angularJs:

      Как я понимаю, когда на фабрике я возвращаю объект, который вводится в контроллер. Когда внутри службы я имею дело с объектом, используя this и ничего не возвращаю.

      Я был в предположении, что служба всегда была синглом , и что новый заводский объект вводится в каждый контроллер. Однако, как выясняется, фабричный объект тоже синглтон?

      Пример кода для демонстрации:

      При смене user.first в ACtrl получается, что user.first в BCtrl также изменен, например, User is singleton?

      Мое предположение заключалось в том, что новый экземпляр был введен в контроллер с фабрикой?

      Все угловые службы — это одноточие :

      Наконец, важно понимать, что все Угловые сервисы являются однопользовательскими приложениями. Это означает, что на инжектор имеется только один экземпляр данной услуги.

      В основном разница между сервисом и фабрикой заключается в следующем:

      Ознакомьтесь с этой презентацией о предоставлении $: http://slides.wesalvaro.com/20121113/#/

      Добавляя к первому ответу, я думаю, что .service () предназначен для людей, которые написали свой код в более объектно-ориентированном стиле (C # / Java) (используя это ключевое слово и экземпляр объекта через прототип / конструктор).

      Фабрика предназначена для разработчиков, которые пишут код, более естественный для javascript / функционального стиля кодирования.

      Взгляните на исходный код метода .service и .factory внутри angular.js — внутренне они все вызывают метод провайдера:

      Стиль обслуживания : ( возможно, самый простой ) возвращает фактическую функцию: полезно для совместного использования служебных функций, которые полезны для вызова, просто добавляя () к ссылке с введенной функцией.

      Служба в AngularJS представляет собой однострочный JavaScript-объект, который содержит набор функций

      Фабричный стиль: ( более задействованный, но более сложный ) возвращает возвращаемое значение функции: создайте экземпляр объекта как новый Object () в java.

      Factory — это функция, которая создает значения. Когда для службы, контроллера и т. Д. Требуется значение, введенное с завода, завод создает значение по требованию. После создания значение используется повторно для всех служб, контроллеров и т. Д., Которые ему нужно вставить.

      Стиль провайдера : ( полная версия, конфигурируемая версия ) возвращает результат функции $ get функции: Configurable.

      Провайдеры в AngularJS являются наиболее гибкой формой фабрики, которую вы можете создать. Вы регистрируете провайдера с модулем так же, как и с сервисом или фабрикой, за исключением того, что вместо этого вы используете функцию provider ().

      .service — зарегистрированная функция будет вызываться как конструктор (он же «новый»)

      .factory — зарегистрированная функция будет вызываться как простая функция

      Оба вызываются один раз, в результате чего один объект, который вводится в другие компоненты вашего приложения.

      AngularJS Service vs Factory

      При объявлении serviceName в качестве аргумента для injectable вам будет предоставлен экземпляр функции. Другими словами, новый FunctionYouPassedToService() . Этот экземпляр объекта становится объектом службы, который AngularJS регистрирует и вводит позже другим services / controllers если это необходимо.

      При объявлении factoryName в качестве аргумента для injectable вам будет предоставлено значение, которое возвращается, вызывая ссылку на функцию, переданную в module.factory .

      В приведенном ниже примере мы определяем MyService двумя разными способами. Обратите внимание, что в .service мы создаем сервисные методы, используя this.methodname . В .factory мы создали фабричный объект и назначили ему методы.

      AngularJS. Сервис

      AngularJS .factory

      Это будет лучшим и коротким ответом на понимание поставщика услуг Vs Factory Vs Provider

      Вот что говорит Бен с демонстрацией jsbin

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

      Сервисы

      Синтаксис : module.service (‘serviceName’, функция);

      Результат : при объявлении serviceName в качестве аргумента для инъекции вам будет предоставлен фактический справочник функций, переданный module.service.

      Использование : Может быть полезно для совместного использования служебных функций, которые полезны для вызова, просто добавляя () к ссылке с введенной функцией. Также может быть запущен с injectedArg.call (это) или аналогичным.

      Фабрики

      Синтаксис : module.factory (‘factoryName’, function);

      Результат : при объявлении factoryName в качестве аргумента для инъекции вам будет предоставлено значение, которое возвращается, вызывая ссылку на функцию, переданную модулю.factory.

      Использование : Может быть полезно вернуть функцию класса, которая затем может быть создана для создания экземпляров.

      Провайдеры

      Синтаксис : module.provider (‘providerName’, функция);

      Результат : при объявлении имени поставщика в качестве аргумента для инъекции вам будет предоставлено значение, возвращаемое при вызове метода $ get ссылки на функцию, переданной модулю.provider.

      Использование : Может быть полезно для возврата функции класса, которая затем может быть создана для создания экземпляров, но перед введением требуется какая-то конфигурация. Возможно, полезно для классов, которые многократно используются для разных проектов? На этот раз все еще туман.

      Существует три способа обработки бизнес-логики в AngularJS: ( Вдохновленный курсом Yaakov Coursera AngularJS ), которые:

      Здесь мы поговорим только о сервисе и фабрике

      СЕРВИС :

      app.js

      index.html

      Основные характеристики сервиса:

      Lazily Instanted : Если услуга не вводится, она не будет создана. Поэтому, чтобы использовать его, вам придется вводить его в модуль.

      Singleton : если он вводится в несколько модулей, все будут иметь доступ только к одному конкретному экземпляру. Поэтому очень удобно обмениваться данными между разными контроллерами.

      ФАБРИКА

      Теперь поговорим о Фабрике в AngularJS

      Сначала давайте посмотрим на синтаксис :

      app.js :

      Теперь, используя вышеуказанные два в контроллере:

      Эти виды услуг соответствуют заводской схеме проектирования . Завод можно рассматривать как центральное место, которое создает новые объекты или методы.

      Это не только производит singleton, но и настраиваемые сервисы.

      Этот .service() метод является фабрикой, которая всегда производит тот же тип сервиса, который является одноэлементным. Нет простого способа настроить его поведение. Этот .service() метод обычно используется как ярлык для чего-то, что не требует какой-либо конфигурации.

      Это помогло мне понять разницу, благодаря сообщению в блоге Паскалем Пречтом.

      Служба — это метод в модуле, который принимает имя и функцию, определяющую службу. Вы можете вводить и использовать эту конкретную услугу в других компонентах, таких как контроллеры, директивы и фильтры. Фабрика — это метод на модуле, а также имя и функция, определяющие фабрику. Мы также можем вводить и использовать его так же, как и с сервисом.

      Объекты, созданные с новым использованием, используют значение свойства prototype своего конструктора как своего прототипа, поэтому я нашел Angular code, который вызывает Object.create (), который, я считаю, является функцией конструктора службы при его создании. Однако фабричная функция — это просто функция, вызываемая, поэтому мы должны вернуть литерал объекта для фабрики.

      Вот угловой код 1.5, который я нашел для фабрики:

      Угловой фрагмент исходного кода для функции factory ():

      Он принимает имя и фабричную функцию, которая передается и возвращает поставщика с тем же именем, у которого есть метод $ get, который является нашей заводской функцией. Всякий раз, когда вы запрашиваете инжектор для конкретной зависимости, он в основном запрашивает соответствующего провайдера для экземпляра этой службы, вызывая метод $ get (). Именно поэтому при создании провайдеров требуется $ get ().

      Вот угловой код 1.5 для обслуживания.

      Оказывается, когда мы вызываем service (), он на самом деле вызывает factory ()! Однако он не просто передаёт нашу функцию конструктора сервисов на завод, как есть. Он также передает функцию, которая просит инжектор создать экземпляр объекта заданным конструктором.

      Другими словами, если мы где-то добавляем MyService, то что происходит в коде:

      Чтобы снова повторить его, служба вызывает фабрику, которая является методом $ get () соответствующего поставщика. Более того, $ injector.instantiate () — это метод, который в конечном итоге вызывает Object.create () с помощью функции-конструктора. Вот почему мы используем «это» в сервисах.

      Для ES5 не имеет значения, что мы используем: service () или factory (), это всегда фабрика, которая называется, которая создает поставщика для нашей службы.

      Вы можете сделать то же самое с услугами, хотя. Однако служба — это функция-конструктор, которая не мешает нам возвращать литералы объектов. Таким образом, мы можем взять наш код обслуживания и написать его таким образом, чтобы он в основном выполнял то же самое, что и наша фабрика, или, другими словами, вы можете написать сервис как фабрику для возврата объекта.

      Почему большинство людей рекомендуют использовать заводы над услугами? Это лучший ответ, который я видел из книги Павла Козловского: «Освоение разработки веб-приложений с помощью AngularJS».

      Метод фабрики является наиболее распространенным способом получения объектов в систему впрыска зависимостей AngularJS. Он очень гибкий и может содержать сложную логику создания. Поскольку фабрики являются регулярными функциями, мы также можем воспользоваться новой лексической областью для моделирования «частных» переменных. Это очень полезно, поскольку мы можем скрыть детали реализации данной службы ».

      Вот основные отличия:

      Сервисы

      Синтаксис: module.service( ‘serviceName’, function );

      Результат: при объявлении serviceName в качестве аргумента для инъекции вам будет предоставлен экземпляр функции, переданной в module.service .

      Использование: Может быть полезно для совместного использования служебных функций , которые полезны для вызова, просто добавляя () к ссылке с введенной функцией. Также может быть запущен с injectedArg.call( this ) или аналогичным.

      Фабрики

      Синтаксис: module.factory( ‘factoryName’, function );

      Результат: при объявлении factoryName в качестве аргумента для инъекции вам будет предоставлено значение, которое возвращается, вызывая ссылку на функцию, переданную module.factory .

      Использование: Может быть полезно вернуть функцию класса, которая затем может быть создана для создания экземпляров.

      «Фабрика» и «Сервис» — это разные способы выполнения DI (инъекция зависимостей) в угловом режиме.

      Поэтому, когда мы определяем DI, используя «сервис», как показано в приведенном ниже коде. Это создает новый GLOBAL-экземпляр объекта «Logger» и вводит его в функцию.

      Когда вы определяете DI с использованием «фабрики», он не создает экземпляр. Он просто передает метод, а затем потребитель внутренне должен совершать вызовы на фабрику для экземпляров объектов.

      Ниже приведено простое изображение, которое визуально показывает, как процесс DI для «Сервиса» отличается от «Фабрика».

      Следует использовать фабрику, когда мы хотим создавать объекты разных типов в зависимости от сценариев. Например, в зависимости от сценария мы хотим создать простой объект «Клиент» или «Клиент» с объектом «Адрес» или «Клиент» с объектом «Телефон». Вот подробное объяснение этого пункта

      Следует использовать службу. Когда у нас есть утилита или общие функции для ввода, такие как Utility, Logger, обработчик ошибок и т. Д.

      Существует также способ вернуть конструктор, чтобы вы могли возвращать новые классы на фабриках, например:

      Таким образом, вы можете сделать это в контроллере, который использует MyObjectWithParam:

      У меня была эта путаница на некоторое время, и я стараюсь изо всех сил дать здесь простое объяснение. Надеюсь, это поможет!

      angular .factory и angular .service оба используются для инициализации службы и работы таким же образом.

      Единственное различие заключается в том, как вы хотите инициализировать свой сервис.

      Оба являются синглтонами

      завод

      app.factory ( , )

      Если вы хотите инициализировать свой сервис из функции, имеющейся с возвращаемым значением , вы должны использовать этот factory метод.

      При вводе этой услуги (например, на ваш контроллер):

      • Угловая функция вызовет вашу функцию (как myService() ), чтобы вернуть объект
      • Singleton — называется только один раз, сохраняется и передает один и тот же объект.

      обслуживание

      app.service ( , )

      Если вы хотите инициализировать свою службу из функции конструктора (используя this ключевое слово), вы должны использовать этот метод service .

      При вводе этой услуги (например, на ваш контроллер):

      • Угловая будет new myService() функцию (как new myService() ) для возврата объекта
      • Singleton — называется только один раз, сохраняется и передает один и тот же объект.

      ПРИМЕЧАНИЕ. Если вы используете factory с или service с , это не сработает.

      Примеры — DEMO

      • Угловая служба против фабрики
      • Угловая служба против завода (с маршрутом)

      Мы можем определить такую ​​услугу:

      .service() — это метод нашего модуля, который принимает имя и функцию, определяющую службу. Довольно прямо. После определения мы можем вводить и использовать эту конкретную услугу в других компонентах, таких как контроллеры, директивы и фильтры, например:

      Теперь то же самое, что и фабрика:

      Опять же, .factory() — это метод в нашем модуле, а также имя и функция, определяющие фабрику. Мы можем вводить и использовать эту штуку точно так же, как и с сервисом. Какая разница здесь?

      Ну, вы можете видеть, что вместо того, чтобы работать с этим на заводе, мы возвращаем объектный литерал. Это почему? Оказывается, сервис — это функция конструктора, а фабрика — нет. Где-то глубоко внутри этого Углового мира есть этот код, который вызывает Object.create () с помощью функции конструктора службы, когда он получает экземпляр. Однако фабричная функция — это просто функция, вызываемая, поэтому мы должны явно вернуть объект.

      Вот как я понял разницу между ними в плане дизайна:

      Сервис . Верните тип, который будет создан для создания объекта такого типа. Если используется Java-аналогия, Service возвращает определение класса Java .

      Factory : возвращает конкретный объект, который можно сразу использовать. В Java Analogy Factory возвращает объект Java .

      Часть, которая часто путает людей (включая меня), заключается в том, что когда вы вводите в свой код Сервис или Фабрику, их можно использовать одинаково, то, что вы получаете в своем коде в обоих случаях, является конкретным объектом, который вы можете немедленно вызвать. Это означает, что в случае Сервиса угловые вызовы «новые» в декларации обслуживания от имени вас. Я думаю, что это сложная концепция.

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

      Основные примеры

      Вернуть объект класса, который имеет один метод

      Вот сервис, который имеет один метод:

      Вот фабрика, которая возвращает объект с помощью метода:

      Возврат значения

      Завод, который возвращает список номеров:

      Служба, которая возвращает список номеров:

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

      Расширенные примеры

      Переменные «класса» с использованием заводов

      В этом примере мы определяем CounterFactory, он увеличивает или уменьшает счетчик, и вы можете получить текущий счетчик или узнать, сколько объектов CounterFactory было создано:

      Мы используем CounterFactory для создания нескольких счетчиков. Мы можем получить доступ к переменной класса, чтобы узнать, сколько счетчиков было создано:

      Результат этого кода:

      живой пример

      Пример «привет мир»

      с factory / service / provider :

      Вы можете понять разницу с этой аналогией. Рассмотрим разницу между нормальной функцией, которая вернет некоторую функцию значения и конструктора, которая получит экземпляр с использованием нового ключевого слова. Создание фабрики аналогично созданию нормальной функции, которая вернет некоторое значение (примитивное или объект), тогда как создание службы похоже на создание функции-конструктора (класс OO), из которой мы можем создать экземпляр с использованием нового ключевого слова. Единственное, что нужно заметить, — это то, что, когда мы используем метод Service для создания сервисов, он автоматически создает экземпляр его с использованием механизма впрыска зависимостей, поддерживаемого AngularJS

  • Добавить комментарий