0

我试图在我的工厂注入一个bootstrap-ui $ modal服务,但是当我这样做时,我得到一个循环依赖问题,并且当我没有定义$ modal时。代码如下所示:在服务中使用服务Angularjs

retryModule = angular.module('g4plus.retry-call', ['ui.bootstrap']) 

retryModule.factory 'RetryCall', ($q, $rootScope)-> 
    requests = {} 
    failedRequests = {} 
    uniqueId = 0 
    modalInstance = undefined 
    modalClose = true 

### Some more code 

    alertUser =()-> 
    modalInstance = $modal.open 
     template: """ 
     <div class="modal-dialog"> 
      ... Some more code ... 

如何在我的工厂内使用$ modal?请不要让我把这些代码放在一个指令中,因为这会破坏目的。如果我可以把这个指令放在一个指令中,我会让这个项目已经完成。控制器也是如此。

谢谢!

如果我注入$莫代尔到我厂循环依赖错误是:

未捕获的错误:[$注射器:CDEP]圆形依赖发现:$模式< - RetryCall < - $ HTTP < - $编译

+1

什么是循环依赖错误你好吗?你能提供可运行的代码吗?为什么使用指令或控制器会破坏目的? (其目的是否失败?) – JeffryHouser

+0

我正在制作一个全局http拦截器,当连接出现错误时将显示一个模式。这不应该依赖于向html添加指令,而是允许开发人员简单地包含工厂并在一天内调用它。错误是:未捕获的错误:[$ injector:cdep]发现循环依赖:$ modal < - RetryCall < - $ http < - $ compile –

+0

听起来像一个模块给我。开发人员将能够设置他们的应用程序依赖于该模块,并且可能会在其中声明一个指令并称之为一天。这并不是太多的工作,而这正是指令的目的。 –

回答

2

原文评论:我没有看到你发布的内容需要$modal ...我觉得循环依赖是因为$modal需要$http和你正在试图建立一个拦截器的代码什么。你可以请张贴更多的代码吗?你如何设置你的$http拦截器? RetryCall的完整定义是什么?您需要在哪里需要$modal

可能的答案:创建拦截器作为一个正常的AngularJS服务(称为像yourHttpInterceptor,然后通过使用

yourAngularModule.config(['$httpProvider', function($httpProvider) { 
    $httpProvider.interceptors.push('yourHttpInterceptor'); 
}]); 

或者添加它,你可以创建一个匿名工厂

yourAngularModule.config(['$httpProvider', function($httpProvider) { 
    $httpProvider.interceptors.push(['$modal', function($modal) { 
     return { 
      request: function(config) { 
       // Do something... 
      }, 
      ... 
     } 
    }])); 
}]); 
+0

我已经这样做了。对不起,如果我没有完整地发布代码,但我觉得我展示了相关的部分。 –

+0

没有这个不解决方案。 – nottinhill

5

接受的答案不提供工作解决方案

问题这里是$modal取决于$http$modal无法在拦截器中请求$http,因为$http尚不存在(因为您仍处于配置阶段,因此配置$httpProvider)。

此答案由用户thaumant介绍了如何解决这个问题,在这里:

I need two instances of AngularJS $http service or what?