AngularJS: Фабрика и обслуживание? [дубликат]


этот вопрос уже есть ответ здесь:

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

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

если я настроил 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.говорите, однако, если я изменю VaderService на модуль.фабрика,код в контроллере больше не будет работать, и это главное отличие. С фабрикой, VaderService впрыснутое внутри к регулятору не экземпляр, поэтому вам нужно вернуть объект при настройке фабрики (см. мой пример в вопросе).

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

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

исходный вопрос ниже.


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

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

.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>

приложение.js:

angular.module('MyApp', [
  'MyApp.services',
  'MyApp.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;
});

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

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;
});
обновить индекс.html (я убедился, что очистил кэш и сделал жесткую перезагрузку). Это работает ровно то же самое, что и с модулем.фабрика. Так в чем же реальная функциональная разница между ними??
4 194

4 ответа:

сервис vs завод


enter image description hereenter image description here

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

Поставщик Фабрики

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

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

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

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

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

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

  • не может быть введен в

Factory и Service это просто обертка provider.

завод

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';
}

фактический код angularjs за службой

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

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

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

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

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

Service вид

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

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

ссылка

$provide service

они технически одно и то же, на самом деле это другая нотация использования