0

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

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

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

Кто-нибудь?

+0

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

+2

Существует [хороший вопрос] (http://stackoverflow.com/questions/19344214/problems-with-circular-dependency -and-oop-in-angularjs) по этой теме, – troig

+3

Вы пробовали создать третий сервис/завод? Это интересное прочтение круговых описаний http://misko.hevery.com/2008/08/01/circular-dependency-in-constructors-and-dependency-injection/ –

ответ

3

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

Я нашел article от Мишко авторами 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- Для каждой функции, которые требуют циклического dependcy: использовать внутреннюю функцию, определенную следующим образом:

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

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

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

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

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

Смежные вопросы