AngularJS: Что такое фабрика?


102

Я много работал, Angular.jsи в целом считаю, что это интересный и мощный фреймворк.

Я знаю, что было много дискуссий по поводу услуг, фабрик, поставщиков и ценностей, но я все еще не совсем понимаю, что такое a Factory.

Factory был определен в других обсуждениях StackOverflow следующим образом:

Заводы

Синтаксис: module.factory( 'factoryName', function );Результат: при объявлении factoryName в качестве аргумента для инъекции вам будет предоставлено значение, которое возвращается при вызове ссылки на функцию, переданной в module.factory.

Я считаю, что это объяснение очень сложно понять, и оно не улучшает мое понимание того, что такое фабрика.

У кого-нибудь есть какие-либо объяснения или примеры из реальной жизни, чтобы рассказать о том, что такое a Factoryи почему вы должны использовать его вместо Service, Providerили другого?

Обновить

A service содержит ссылку на любой объект .

A factory - это функция, которая возвращает любой объект

A provider - это функция, которая возвращает любую функцию

- уф -


6
Я бы не сказал, что это дубликат того вопроса, скорее, я прочитал этот вопрос, прежде чем задавать этот, поскольку его ответ Factories(цитируемый выше) был немного запутанным. Некоторые из приведенных ниже ответов сводятся Factoriesк тому, что даже я могу понять
Code Whisperer

1
У этого вопроса больше голосов, чем у того, который он "дублирует", может быть, все должно быть наоборот?
Code Whisperer

3
Эта ссылка хорошо это объясняет.
Ахмед

Ответы:


71

Насколько я понимаю, все они практически одинаковы. Основные различия заключаются в их сложности. Провайдеры настраиваются во время выполнения, фабрики немного более надежны, а сервисы - простейшая форма.

Проверьте этот вопрос AngularJS: Сервис против провайдера против фабрики

Также эта суть может быть полезна для понимания тонких различий.

Источник: https://groups.google.com/forum/#!topic/angular/hVrkvaHGOfc

jsFiddle: 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() {
    // In the provider function, you cannot inject any
    // service or factory. This can only be done at the
    // "$get" method.

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

Итак, можно взглянуть на них в порядке их сложности Provider > Factory > Service > Value?
Code Whisperer

2
Это один способ взглянуть на это, другой - думать о Factory и Service как о абстракциях Provider. Кто-то поправит меня, если я ошибаюсь, но фабрика и служба используют Provider под капотом. Именно поэтому provide - версия «максимально приближенная к металлу». Я считаю, что Value - это способ определения констант, которые затем можно использовать в масштабах всего приложения.
Джонатан Палумбо

18

Я вижу одно важное отличие в том, что вы можете запускать собственный код на заводе. Но в сервисе происходит только создание объекта.

myJs.factory('Factory', function() {

    //Write custom code here

    return {
            Hello: function() {
            return "Hello, World!"
        }
    };
});

1
вы также можете запускать собственный код в функции конструктора службы, не так ли? никто не сказал внутри функции конструктора, что вы не можете запускать другой код
неполярность

9

Мои два цента по этой теме. Я очень новичок и просто разбираюсь в Angular JS, и это было одной из вещей, которые меня сильно смущали, поэтому я изучил его довольно подробно. Я делал заметки для интервью, и это может быть полезно другим.

  • Сервис и завод делают одно и то же по-разному
  • оба являются инъекционными
  • для большинства вещей используйте фабричный синтаксис
  • легче понять
  • в настоящее время с es6 "сервис" выполняется, так как он лучше конвертируется в классы es6
  • по сути, это абстрагирование бизнес-логики от контроллера
  • если вы используете бизнес-логику с контроллерами, вы можете использовать только с контроллерами
  • Контроллер предназначен для размещения данных в области видимости, не обрабатывая долгую бизнес-логику
  • Итак, что происходит в приведенном выше сценарии, это то, что сложная бизнес-логика связана с контроллерами. Не для обработки данных. Так что вкладывайте его по частям в сервис или на завод. Итак, ваш код компактный и модульный.
  • услуги одиночные

0

Службы - это в основном объекты, в которых вы описываете класс конструктора объекта. Где-то глубоко внутри фреймворка вызывается функция Object.create (), а затем вы можете использовать службу, вызывая ее объект и методы с помощью контроллера. Factory, с другой стороны, не создает объект по умолчанию и, следовательно, требует, чтобы вы вернули все местоположение объекта, как только вы закончите определение всех атрибутов и методов.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.