При создании метода сервиса какая разница между module.service и module.factory
Я не знаю, что такое лучшая практика и что мне следует использовать.
В чем разница между двумя способами?
module.service(..);
а также
module.factory(..);
2 ответа
По этому поводу от Павла Козловского есть отличный пост в группе Google:
https://groups.google.com/forum/
Цитируется из Пауэл:
на самом деле, $provide.provider, $provide.factory и $provide.service - это более или менее одно и то же в том смысле, что все они являются чертежами / инструкциями для создания экземпляров объекта (эти экземпляры затем готовы для внедрения в соавторы).,
$ provide.provider - самый сложный метод регистрации чертежей, он позволяет вам иметь сложную функцию создания и параметры конфигурации.
$ provide.factory - это упрощенная версия $ provide.provider, когда вам не нужно поддерживать параметры конфигурации, но при этом требуется более сложная логика создания.
$provide.service предназначен для случаев, когда вся логика создания сводится к вызову функции конструктора.
Таким образом, в зависимости от сложности вашей логики построения вы можете выбрать один из следующих вариантов: $ provide.provider, $provide.factory и $provide.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; }
});
Если у вас было приложение, в котором различные контроллеры, представления и т. Д. Все хотят внести свой вклад в общее количество вещей, вышеуказанная служба работает.
Но что, если каждое приложение хочет вести свой подсчет вещей?
В этом случае одиночная служба не будет работать, поскольку она может отслеживать только все из них. Однако фабрика позволяет вам создавать новый сервис каждый раз, когда вы хотите запустить новый счетчик.
angular.module("myModule", [])
.factory("thingCountingServiceFactory", function() {
var thingCount = 0;
this.countThing = function() { thingCount++; }
this.getNumThings = function() { return thingCount; }
});
С вышеупомянутой фабрикой вы можете позвонить new thingCountingServiceFactory()
в любое время и получить новый thingCountingService
установлен в 0