При создании метода сервиса какая разница между module.service и module.factory

Я не знаю, что такое лучшая практика и что я должен использовать.

В чем разница между двумя способами?

module.service(..);

и

module.factory(..);

Ответ 1

От 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()];
}

Ответ 2

Рассмотрим следующую услугу.

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