Я не знаю, что такое лучшая практика и что я должен использовать.
В чем разница между двумя способами?
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