Службы AngularJS внедряют друг друга, вызывая бесконечный цикл [дубликаты]

0

В настоящее время я сталкиваюсь с кошмаром в своем заявлении. У меня есть 1 Сервис и 1 Фабрика, и им нужно получить доступ друг к другу, например:

// Dependency Injection   
MyFactory(MyService)
MyService(MyFactory)

и это делает мой переход приложения (но без ошибок на консоли). Я понятия не имею, что происходит, и мне нужно тогда общаться друг с другом.

Кто угодно?

  • 0
    Как я помню, циклические зависимости не разрешены в angularjs 1, это вызывает ошибку. Некоторое время назад у меня возникла та же проблема, и я решил ее, разделив свои услуги на несколько более мелких частей.
  • 2
    Есть хороший вопрос по этой теме,
Показать ещё 1 комментарий
Теги:
dependency-injection
angularjs-service
angularjs-factory

3 ответа

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

Вы создали круговую зависимость, которая является неправильной.

Я нашел статью от Мишко авторов AngularJS об этой проблеме.

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

1

Рекурсивные алгоритмы в стороне (я полагаю, вы здесь не имеете рекурсии), вы не можете иметь круговые зависимости и это не угловое ограничение.

Не видя кода, я бы сказал, что у вас есть пара опций

1) Повторите функциональность от одного в другом, чтобы они больше не зависели друг от друга.

2) Объединить две службы (может быть невозможно или целесообразно)

3) Разделить функциональность на большее количество сервисов/фабрик, чтобы разбить круговую зависимость.

0

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

У меня когда-то была циклическая зависимость: это было из-за конфигурации перехватчика $ http, которая перенаправляется на страницу входа, используя $ state of ui-router. И u-router имеет зависимость от $ http.

Поэтому, если вы уверены в том, что вы делаете, есть пара способов

1- В конструкторе myService вызовите myFactory.setMyService (это).

2- Сделайте функцию getter в myService, которая будет искать поле myFactoryif, которое оно инициализируется. Если не вызывать $ injector.get("myFactory");

3- Для каждой функции, которая нуждается в циклической зависимости: используйте внутреннюю функцию, определенную следующим образом:

this.toto = function(params){$injector.invoke(this.totoInternal, this, {params:params}};
this.totoInternal = ['params', 'myFactory' function(params, myFactory){...}]

4- В функции module.run инстанцируют оба сервиса (без их зависимостей) и устанавливают для каждого из них поле:

module.run(myService, myFactory){
    myService.setMyFactory(myFactory);
    myFactory.setMyService(myService);
}

Точка 1 и 2 должна выполняться только в одном из них. Точка 3 должна использоваться в обоих направлениях. Пункт 4 устанавливает зависимостей, прежде чем вам понадобится фактический сервис (надеясь, что они вам не понадобятся в модуле.run, который будет выполняться раньше.

EDIT: о стороннем сервисе, который используется в качестве посредника в принятом ответе → я предпочитаю использовать $ injector в качестве медиатора. Это справедливо.

Ещё вопросы

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