Angularjs: добиться такой же структуры для обслуживания, как фабрика

0

Я играю с angularjs services и factories. Я создал фабрику под названием BookFactory следующим образом:

// Code goes here

app
  .factory('BootFactory', function() {
    var bookFactory;

    function add() {

    }

    function remove() {

    }

    function getAll() {

    }
    bookFactory = {
      add: add,
      remove: remove,
      getAll: getAll
    }
    return bookFactory;

  });

И BookService выглядит следующим образом:

app.service('BookService', function() {

        var bookService;

        function add() {

        }

        function remove() {

        }

        function getAll() {

        }

        /*
        It throws:
        Uncaught ReferenceError: Invalid left-hand side in assignment.

        How can I achieve the same structure with the services which I have used in factories.

        this = {
          add: add,
          remove: remove,
          getAll: getAll
        };

        */

        //Do I have to add all methods like this
        this.add=add;
        this.remove=remove;
        this.getAll=getgAll;

        //Or there any other better way to achieve it

      });

Я хочу сделать так, чтобы я сохранил структуру, то есть хочу получить что-то вроде этого как для фабрики, так и для сервисов:

bookFactory = {
          add: add,
          remove: remove,
          getAll: getAll
        }

В случае фабрики он отлично работает. Но в случае службы я не могу этого сделать. потому что сервис работает с this и я не могу этого сделать:

/*
            It throws:
            Uncaught ReferenceError: Invalid left-hand side in assignment.

            How can I achieve the same structure with the services which I have used in factories.

            this = {
              add: add,
              remove: remove,
              getAll: getAll
            };

            */

Я собираюсь сделать следующее:

//Do I have to add all methods like this
            this.add=add;
            this.remove=remove;
            this.getAll=getgAll;

            //Or there any other better way to achieve it

Есть ли лучший способ сделать это? Здесь плундр.

Теги:
factory
plunker

3 ответа

2
Лучший ответ

Вы можете создать bookService, например as-

app.service('BookService', function() {
    return {
          add:add,
          remove:remove,
          getAll:getAll
        };

    function add() {

        }

        function remove() {

        }

        function getAll() {

        }

  });
  • 0
    Мы не должны ничего возвращать с сервисной функцией, так как это функция конструктора.
  • 0
    Да, правильно. Однако служба - это функция конструктора, которая не мешает нам выполнять дополнительную работу и возвращать литералы объекта. Фактически, функции конструктора в JavaScript могут возвращать все, что хотят. Таким образом, мы можем взять наш сервисный код и написать его так, чтобы он в основном делал то же самое, что и наша фабрика
Показать ещё 2 комментария
1

Вы можете сделать что-то вроде этого:

app.service('BookService', function() {
    function add() {

    }

    function remove() {

    }

    function getAll() {

    }

    var bookService = {
      add: add,
      remove: remove,
      getAll: getAll
    };

    return bookService;
  });

Угловому не важно, как возвращается ваша услуга. Factory vs Service - это только то, как он вызван, фабрика называется так: factory() и сервис вроде этого: new service(). В JS конструктор может вернуть все, что вы хотите.

1

Фабрики и службы - это всего лишь два несколько разных способа создания экземпляра объекта службы.

Функция factory возвращает экземпляр.

Функция сервиса является функцией-конструктором и используется с new (или что-то вроде этого) для создания экземпляра. Конструктор функции в JS может вернуть экземпляр объекта, который был реализован напрямую (вместо по умолчанию this, читать далее).

Это должно позволить вам сделать это:

  .service('BookService', function() {
    var bookService;

    function add() {}

    function remove() {}

    function getAll() {}

    bookService = {
      add: add,
      remove: remove,
      getAll: getAll
    }
    return bookService;
  })

Так что да, factory и service могут функционировать точно так же из-за этого JS quirk.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню