AngularJS: Factory и сервис?

EDIT Январь 2016: Так как это все еще привлекает внимание. Спрашивая об этом, я выполнил несколько проектов AngularJS, и для тех, кого я использовал в основном factory, создал объект и вернул объект в конце. Мои утверждения ниже все еще верны.

EDIT: Я думаю, что, наконец, понимаю основное различие между ними, и у меня есть пример кода для демонстрации. Я также думаю, что этот вопрос отличается от предлагаемого дубликата. Дубликат говорит, что сервис не является реальным, но если вы его настроите, как я показал ниже, это на самом деле. Услуга может быть настроена точно так же, как и factory. Я также предоставлю код, который показывает, где factory выходит из строя через службу, что никакой другой ответ, похоже, не делает.

Если я настроил VaderService так (например, как сервис):

var module = angular.module('MyApp.services', []);

module.service('VaderService', function() {
    this.speak = function (name) {
        return 'Join the dark side ' + name;
    }
});

Тогда в моем контроллере я могу это сделать:

module.controller('StarWarsController', function($scope, VaderService) {
    $scope.luke = VaderService.speak('luke');   
});

При обслуживании, VaderService, введенный в контроллер, создается, поэтому я могу просто вызвать VaderService.speak, однако, если я изменю VaderService на module.factory, код в контроллере больше не будет работать, и это главное отличие. При использовании factory встраиваемый в контроллер контроллер VaderService не создается, поэтому вам нужно вернуть объект при настройке factory (см. Мой пример в вопросе).

Однако вы можете настроить службу точно так же, как вы можете настроить factory (IE вернуть объект), а служба ведет себя точно так же, как factory

Учитывая эту информацию, я не вижу причин использовать factory по сервису, сервис может делать все factory и может.

Оригинальный вопрос ниже.


Я знаю, что это было задано много раз, но я действительно не вижу никакой функциональной разницы между фабриками и услугами. Я прочитал этот учебник: http://blogs.clevertech.biz/startupblog/angularjs-factory-service-provider

И, похоже, это дает достаточно хорошее объяснение, однако я настроил свое приложение следующим образом:

index.html

<!DOCTYPE html>
<html>
    <head>
    <title>My App</title>
    <script src="lib/angular/angular.js"></script>
    <script type="text/javascript" src="js/controllers.js"></script>
    <script type="text/javascript" src="js/VaderService.js"></script>
    <script type="text/javascript" src="js/app.js"></script>
    </head>

    <body ng-app="MyApp"> 
        <table ng-controller="StarWarsController">
            <tbody>
            <tr><td>{{luke}}</td></tr>
            </tbody>
        </table>
    </body>
</html>

app.js:

angular.module('MyApp', [
  'MyApp.services',
  'MyApp.controllers'
]);

controllers.js:

var module = angular.module('MyApp.controllers', []);

module.controller('StarWarsController', function($scope, VaderService) {
    var luke = new VaderService('luke');
    $scope.luke = luke.speak();
});

VaderService.js

var module = angular.module('MyApp.services', []);

module.factory('VaderService', function() {
    var VaderClass = function(padawan) {
        this.name = padawan;
        this.speak = function () {
            return 'Join the dark side ' + this.name;
        }
    }

    return VaderClass;
});

Затем, когда я загружаю index.html, я вижу "Присоединиться к темной стороне люка", отлично. Точно так, как ожидалось. Однако, если я изменю VaderService.js на это (обратите внимание на module.service вместо module.factory):

var module = angular.module('MyApp.services', []);

module.service('VaderService', function() {
    var VaderClass = function(padawan) {
        this.name = padawan;
        this.speak = function () {
            return 'Join the dark side ' + this.name;
        }
    }

    return VaderClass;
});

Затем перезагрузите index.html(я убедился, что я опустошил кеш и сделал жесткую перезагрузку). Он работает точно так же, как и с module.factory. Итак, какова реальная функциональная разница между двумя?

Ответы

Ответ 1

Сервис vs Factory


enter image description hereenter image description here

Разница между factory и сервисом аналогична разнице между функцией и объектом

Factory Поставщик

  • Дает нам возвращаемое значение функции, т.е. Вы просто создаете объект, добавляете к нему свойства, а затем возвращаете тот же объект. Когда вы передаете эту службу в свой контроллер, эти свойства объекта теперь будут доступны в этом контроллере через ваш factory. (Гипотетический сценарий)

  • Синглтон и будет создан только один раз

  • Многоразовые компоненты

  • Factory - отличный способ для обмена данными между контроллерами, такими как совместное использование данных.

  • Можно использовать другие зависимости

  • Обычно используется, когда экземпляр службы требует сложной логики создания

  • Невозможно ввести в функцию .config().

  • Используется для не настраиваемых сервисов

  • Если вы используете объект, вы можете использовать поставщик factory.

  • Синтаксис: module.factory('factoryName', function);

Поставщик услуг

  • Дает нам экземпляр функции (объекта). Вы только что создали экземпляр с новым ключевым словом, и вы добавите свойства в это, и служба вернет его. Когда вы передадите эту услугу в свой контроллер, свойства на этом теперь будут доступны на этом контроллере через вашу службу. (Гипотетический сценарий)

  • Синглтон и будет создан только один раз

  • Многоразовые компоненты

  • Службы используются для связи между контроллерами для обмена данными

  • Вы можете добавить свойства и функции к объекту службы с помощью ключевого слова this

  • Зависимости вводятся как аргументы конструктора

  • Используется для простой логики создания

  • Невозможно ввести в функцию .config().

  • Если вы используете класс, вы можете использовать поставщика услуг

  • Синтаксис: module.service(‘serviceName’, function);

Пример демонстрации

В приведенном ниже примере я определил MyService и MyFactory. Обратите внимание, как в .service Я создал методы службы, используя this.methodname. В .factory Я создал объект factory и назначил ему методы.

AngularJS.service


module.service('MyService', function() {

    this.method1 = function() {
            //..method1 logic
        }

    this.method2 = function() {
            //..method2 logic
        }
});

AngularJS.factory


module.factory('MyFactory', function() {

    var factory = {}; 

    factory.method1 = function() {
            //..method1 logic
        }

    factory.method2 = function() {
            //..method2 logic
        }

    return factory;
});

Также взгляните на эти красивые вещи

Смутно о сервисе vs factory

AngularJS Factory, служба и поставщик

Angular.js: служба vs поставщик vs factory?

Ответ 2

Factory и Service - это просто оболочка provider.

Factory

Factory может возвращать все, что может быть class(constructor function), instance of class, string, number или boolean. Если вы вернете функцию constructor, вы можете создать экземпляр в своем контроллере.

 myApp.factory('myFactory', function () {

  // any logic here..

  // Return any thing. Here it is object
  return {
    name: 'Joe'
  }
}

Сервис

Сервис ничего не должен возвращать. Но вы должны назначить все в переменной this. Поскольку служба будет создавать экземпляр по умолчанию и использовать его как базовый объект.

myApp.service('myService', function () {

  // any logic here..

  this.name = 'Joe';
}

Фактический угловой код за сервисом

function service(name, constructor) {
    return factory(name, ['$injector', function($injector) {
        return $injector.instantiate(constructor);
    }]);
}

Это просто обертка вокруг Factory. Если вы вернете что-то из Service, то оно будет вести себя как Factory.

IMPORTANT: результат возврата из Factory и службы будет кешем, и то же самое будет возвращено для всех контроллеров.

Когда я должен их использовать?

Factory в большинстве случаев предпочтительнее. Его можно использовать, если у вас есть функция constructor, которая должна быть создана в разных контроллерах.

Service является видом объекта Singleton. Возврат объекта из Сервиса будет таким же для всех контроллеров. Его можно использовать, когда вы хотите иметь один объект для всего приложения. Например: Аутентифицированные данные пользователя.

Для дальнейшего понимания прочитайте

http://iffycan.blogspot.in/2013/05/angular-service-or-factory.html

http://viralpatel.net/blogs/angularjs-service-factory-tutorial/

Ответ 3

  • Если вы используете услугу, вы получите экземпляр функции ("this" ключевое слово).
  • Если вы используете factory, вы получите значение, которое возвращается путем вызова ссылки на функцию (оператор возврата в factory)

Factory и Service являются наиболее часто используемыми рецептами. Единственное различие между ними заключается в том, что рецепт службы лучше работает для объектов пользовательского типа, а factory может создавать примитивы и функции JavaScript.

Ссылка

Ответ 4

$предоставлять услугу

Они технически одинаковы, на самом деле это отличная нотация использования функции provider службы $provide.

  • Если вы используете класс: вы можете использовать служебную нотацию.
  • Если вы используете объект: вы можете использовать нотацию factory.

Единственная разница между нотами service и factory заключается в том, что служба обновлена, а factory - нет. Но для всего остального они оба выглядят, пахнут и ведут себя одинаково. Опять же, это просто сокращение для функции $offer.provider.

// Factory

angular.module('myApp').factory('myFactory', function() {

  var _myPrivateValue = 123;

  return {
    privateValue: function() { return _myPrivateValue; }
  };

});

// Service

function MyService() {
  this._myPrivateValue = 123;
}

MyService.prototype.privateValue = function() {
  return this._myPrivateValue;
};

angular.module('myApp').service('MyService', MyService);