Как внедрить 2 разных экземпляра модуля в AngularJs

0

Скажем, у меня есть файл crudService.js:

crudService.module('genericCrudService', ['$http', '$log', 'config',  function ($http, $log, config) {
        ....
        return {
            setSomeAttribute: function(m) {
                // set attribute
            }
        }
    }]);

И тогда у меня есть модуль, которому нужно по-разному настроить экземпляры этой службы crud:

module.factory('Task', ['genericCrudService','genericCrudService', function (service, actionService) {
        ...
        return {
           init: function(p) {
               service.setSomeAttribute('a');
               actionService.setSomeAttribute('b');
           }
        }
    }]);

Но затем я заметил при попытке использовать служебную переменную, что ее атрибут установлен на 'a'. Что я делаю не так?

  • 0
    Не совсем понятно, что вы пытаетесь сделать или каковы ожидания
  • 0
    Как уже упоминали другие, эти сервисы являются синглтонами по своему дизайну, и, охватывая эту модель, она обеспечивает мощный метод связи внутри модуля. Например, вы можете добавить свой сервис в один контроллер, подписаться на событие, сохранить данные или изменить переменную в сервисе, а в другом контроллере вы можете получить доступ к этим данным или вызвать событие. В Angular 2 это ваш способ общения между вашими компонентами, потому что область действия исчезла. Я верю, что все, что вам нужно сделать, можно сделать с помощью синглтона, вам нужно только переосмыслить свой подход.
Теги:

2 ответа

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

Угловые услуги - это синглтоны, которые кэшируются при первой инъекции:

Все сервисы в Angular - это одиночные игры. Это означает, что инжектор использует каждый рецепт не более одного раза для создания объекта. Затем инжектор кэширует ссылку для всех будущих потребностей.

genericCrudService относится к одной и той же службе, вводя ее в качестве service и переменных actionService приводит к наличию экземпляра службы genericCrudService в обеих переменных, service === actionService.

Если служба должна получить новый экземпляр только в некоторых случаях, экземпляр службы может получить метод (например, factory или getInstance), который возвращает новый экземпляр объекта:

  app.factory('service', () => {
    function Service() {
      this.method = ...;
      this.factory = () => new Service;
    }

    return new Service;
  });

  ...
  var serviceInstance = service.factory();

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

  app.factory('Service', () => function () {
    this.method = ...;       
  });

  ...
  var serviceInstance = new Service;
0

Вы не можете этого сделать, потому что угловое обслуживание - одноэлементное... Посмотрите на этот пост, он объясняет это очень хорошо;) Есть услуги Angularjs singleton?

Вы также можете посмотреть, что AngularJS: Service vs provider vs factory. Может быть, вы найдете способ сделать то, что хотите;)

Ещё вопросы

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