AngularJS: сервіс vs провайдер vs фабрика
Які відмінності між Service
, Provider
і Factory
в AngularJS?
3291
3
Які відмінності між Service
, Provider
і Factory
в AngularJS?
Зі списку розсилки AngularJS я отримав дивовижну тему, яка пояснює сервіс vs фабрика vs провайдер та їх використання в ін'єкціях. Складаємо відповіді:
Сервіси
Синтаксис:
module.service( 'serviceName', function );
Результат: При оголошенні serviceName в якості ввідного аргументу буде надано екземпляр функції. Іншими словами
new FunctionYouPassedToService()
.Заводи
Синтаксис:
модуль.фабрика( 'назва фабрики', функція );
Результат: При оголошенні factoryName в якості ввідного аргументу вам буде надано значення, яке повертається при виклику посилання на функцію, передану в module.factory.
Провайдери
Синтаксис:
module.provider( 'providerName', function );
Результат: При оголошенні providerName в якості ввідного аргументу буде отримано
(new ProviderFunction()).$get()
. Функція-конструктор екземплярується до виклику методу $get -ProviderFunction
є посиланням на функцію, що передається в module.provider.Перевагою провайдерів є те, що вони можуть бути налаштовані на етапі конфігурації модуля.
З наданим кодом можна ознайомитись за посиланням тут.
Тут є чудове подальше пояснення від Misko:
У цьому випадку інжектор просто повертає значення як є. Але що, якщо ви хочете обчислити значення? Тоді використовуйте фабрику
Отже,
factory
- це функція, яка відповідає за створення значення. Зверніть увагу, що фабрична функція може запитувати інші залежності.Але що, якщо ви хочете бути більш ООП і мати клас з назвою Greeter?
Тоді для створення екземпляру вам потрібно буде написати
Тоді ми можемо запросити 'greeter' в контролері ось так
Але це занадто багатослівно. Коротше це можна написати так:
provider.service('greeter', Greeter);
Але що, якщо ми хочемо налаштувати клас
Greeter
перед ін'єкцією? Тоді ми могли б написатиТоді ми можемо зробити так:
Зауважимо, що "послуга", "фабрика" та "значення" є похідними від "постачальник".
[JS Демонстрація скрипки][1]
Приклад "Hello world" з "фабрикою"/"сервісом"/"провайдером":
;
Я помітив дещо цікаве, граючись з провайдерами.
Видимість ін'єкцій у провайдерів інша, ніж у сервісів та фабрик. Якщо оголосити AngularJS "константу" (наприклад,
myApp.constant('a', 'Robert');
), то її можна вводити і в сервіси, і в фабрики, і в провайдери.Але якщо ви оголосите AngularJS "value" (наприклад,
myApp.value('b', {name: 'Jones'});
), ви можете вставити його в сервіси і фабрики, але НЕ в функцію створення провайдера. Однак ви можете ввести його в функцію$get
, яку ви визначаєте для свого провайдера. Це згадується в документації AngularJS, але її легко пропустити. Ви можете знайти її на сторінці %provide в розділах про методи значення та константи.http://jsfiddle.net/R2Frv/1/