Я не знаю, что такое лучшая практика и что я должен использовать.
В чем разница между двумя способами?
module.service(..);
и
module.factory(..);
Я не знаю, что такое лучшая практика и что я должен использовать.
В чем разница между двумя способами?
module.service(..);
и
module.factory(..);
От Pawel Kozlowski есть отличный пост группы google:
https://groups.google.com/forum/#!msg/angular/hVrkvaHGOfc/idEaEctreMYJ
Цитата из Powel:
на самом деле $provision.provider, $provision.factory и $provision.service более или менее то же самое в том смысле, что все они чертежи/инструкции для создания экземпляров объекта (те экземпляры затем готовы для ввода в коллабораторы).
$offer.провайдер - самый простой способ регистрации чертежей, это позволяет вам иметь сложную функцию создания и параметры конфигурации.
$обеспечивает .factory - упрощенная версия $offer.provider, когда вы не нужно поддерживать параметры конфигурации, но все же хотите иметь более сложная логика создания.
$обеспечивает.сервис для случаев, когда вся логика создания кипит вплоть до вызова функции-конструктора.
Итак, в зависимости от сложности вашей логики построения вы бы выберите один из $offer.provider, $provision.factory и $provision.service но в итоге вы получите новый экземпляр.
Вот сопроводительная сценария для демонстрации (из потока): http://jsfiddle.net/pkozlowski_opensource/PxdSP/14/
И код:
var myApp = angular.module('myApp', []);
//service style, probably the simplest one
myApp.service('helloWorldFromService', function() {
this.sayHello = function() {
return "Hello, World!"
};
});
//factory style, more involved but more sophisticated
myApp.factory('helloWorldFromFactory', function() {
return {
sayHello: function() {
return "Hello, World!"
}
};
});
//provider style, full blown, configurable version
myApp.provider('helloWorld', function() {
this.name = 'Default';
this.$get = function() {
var name = this.name;
return {
sayHello: function() {
return "Hello, " + name + "!"
}
}
};
this.setName = function(name) {
this.name = name;
};
});
//hey, we can configure a provider!
myApp.config(function(helloWorldProvider){
helloWorldProvider.setName('World');
});
function MyCtrl($scope, helloWorld, helloWorldFromFactory, helloWorldFromService) {
$scope.hellos = [
helloWorld.sayHello(),
helloWorldFromFactory.sayHello(),
helloWorldFromService.sayHello()];
}
Рассмотрим следующую услугу.
angular.module("myModule", [])
.service("thingCountingService", function() {
var thingCount = 0;
this.countThing = function() { thingCount++; }
this.getNumThings = function() { return thingCount; }
});
Если у вас есть приложение, в котором различные контроллеры, представления и т.д. все хотят внести свой вклад в один общий подсчет вещей, вышеуказанная служба работает.
Но что, если каждое приложение хочет сохранить свой собственный счет?
В этом случае служба singleton не будет работать, поскольку она может отслеживать только все из них. Однако factory позволяет создавать новую услугу каждый раз, когда вы хотите запустить новый счетчик.
angular.module("myModule", [])
.factory("thingCountingServiceFactory", function() {
var thingCount = 0;
this.countThing = function() { thingCount++; }
this.getNumThings = function() { return thingCount; }
});
С помощью вышеуказанного factory вы можете вызвать new thingCountingServiceFactory()
в любое время и установить новый thingCountingService
на 0