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


101

Я багато працював над цим, Angular.jsі в цілому я вважаю, що це цікава та потужна рамка.

Я знаю, що було багато дискусій щодо Служб проти Фабрик проти Провайдерів проти цінностей, але я все ще досить розгублений, що Factoryтаке.

Фабрика була визначена в інших дискусіях StackOverflow таким чином:

Заводи

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

Мені здається, що це пояснення дуже важко зрозуміти, і це не посилює моє розуміння того, що таке фабрика.

Буде чи хто - небудь є якісь - або пояснення або реальні приклади , щоб розповісти про , що саме Factoryі чому ви повинні використовувати його замість а Service, Providerабо інший?

Оновлення

А service містить посилання на будь-який об’єкт .

A factory - це функція, яка повертає будь-який об'єкт

A provider - це функція, яка повертає будь-яку функцію

- феу -


6
Я б не сказав, що це дублікат цього питання, скоріше я прочитав це питання, перш ніж задавати це питання, оскільки його відповідь Factories(цитував вище) було трохи заплутаним. Деякі з наведених нижче відповідей зводяться Factoriesдо чогось, що я навіть можу зрозуміти
Кодекс Шепітера

1
Це питання має більше відгуків, ніж те, яке воно "дублює", можливо, все має бути навпаки?
Code Whisperer

3
Це посилання це добре пояснює.
Ахмед

Відповіді:


70

Як я розумію, всі вони однакові. Основні відмінності полягають у їх складності. Постачальники налаштовуються під час виконання, фабрики трохи надійніші, а послуги - найпростіша форма.

Ознайомтеся з цим питанням 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?
Кодекс Шепіт

2
Це один із способів поглянути на це, інший - розглядати Фабрику та Сервіс як абстракції Провайдера. Хтось виправить мене, якщо я помиляюся, але постачальник заводу та сервісу використовує постачальника під кришкою. Ось чому пропонується версія "Найближче до металу". Я вважаю, що Value - це спосіб визначити константи, які потім можна використовувати в застосуванні в широких межах.
Джонатан Паламбо

18

Я бачу одну головну різницю в тому, що на заводі можна запускати спеціальний код. Але в сервісі відбувається лише створення об’єктів.

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

    //Write custom code here

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

1
ви також можете запустити спеціальний код у функції конструктора послуг, чи не так? ніхто не сказав всередині функції конструктора, ви не можете запустити інший код
nonopolarity

9

Мої два центи на цю тему. Я дуже новачок і просто розумію Angular JS, і це було однією з речей, яка мене дуже збентежила, і тому я вивчив це дещо детально. Я робив нотатки для давання інтерв'ю, і це може бути корисно для інших.

  • сервіс та фабрика роблять однакові речі по-різному
  • обидва є ін’єкційними
  • для більшості речей використовується заводський синтаксис
  • легше зрозуміти
  • нині з es6 "сервіс" робиться, оскільки він перетворюється в класи es6 краще
  • його по суті відсторонення ділової логіки від контролера
  • якщо ви використовуєте бізнес-логіку з контролерами, тоді ви можете використовувати лише з контролерами
  • Контролер призначений для розміщення даних про область, а не для обробки тривалої логіки бізнесу
  • тож, що трапляється у вищезгаданому сценарії, це те, що складна бізнес-логіка пов'язана з контролерами. Не для обробки даних. Тому покладіть шматочки та шматочки в сервіси чи на завод. Тож ваш код є худорлявим та модульним.
  • послуги - одинаки

0

Послуги - це переважно об'єкти, в яких ви описуєте клас конструктора об'єкта. Десь глибоко в рамках викликується функція Object.create (), і тоді ви можете використовувати службу, викликаючи її об'єкт та методи за допомогою контролера. Фабрика, з іншого боку, не створює об'єкт за замовчуванням, а тому вимагає повернути все розташування об'єкта, як тільки ви закінчите, визначаючи всі атрибути та методи.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.