【问题标题】:Using a service within a service Angularjs在服务 Angularjs 中使用服务
【发布时间】:2014-03-03 23:33:07
【问题描述】:

我正在尝试将 bootstrap-ui $modal 服务注入我的工厂,但是当我这样做时,我会遇到循环依赖问题,而当我没有定义 $modal 时。代码如下:

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?请不要让我将此代码放在指令中,因为这违背了目的。如果我能把它放在一个指令中,我早就完成了这个项目。控制器也是如此。

谢谢!

如果我将 $modal 注入我的工厂,循环依赖错误是:

未捕获的错误:[$injector:cdep] 找到循环依赖项:$modal

【问题讨论】:

  • 你得到什么循环依赖错误?你能提供可运行的代码吗?为什么使用指令或控制器会破坏目的? (它打败了哪个目的?)
  • 我正在制作一个全局 http 拦截器,当连接出错时会显示一个模式。这不应该依赖于向 html 添加指令,而是允许开发人员简单地包含工厂并收工。错误是:未捕获错误:[$injector:cdep] 找到循环依赖:$modal
  • 对我来说听起来像是一个模块。开发人员将能够将他们的应用程序设置为依赖于该模块,并可能在其中声明一个指令并称其为一天。这不是太多的工作,这就是指令的用途。
  • 代码确实位于导入的模块中。我只是想在我的代码中使用一个简单的服务。忘记 $modal 服务做任何 DOM 的事情,我只需要知道如何使用该服务。
  • 我在您发布的代码中看不到任何需要$modal... 我认为循环依赖是因为$modal 需要$http 并且您正在尝试设置拦截器。你能发布更多代码吗?你是如何设置你的$http 拦截器的? RetryCall 的完整定义是什么?您在哪里需要 $modal

标签: javascript angularjs twitter-bootstrap angular-ui angular-ui-bootstrap


【解决方案1】:

接受的答案没有提供有效的解决方案。

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

用户 thaumant 的这个回答解释了如何解决这个问题,在这里:

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

【讨论】:

    【解决方案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...
                },
                ...
            }
        }]));
    }]);
    

    【讨论】:

    • 我已经这样做了。抱歉,如果我没有完整地发布代码,但我觉得我展示了相关部分。
    • 不,这不是解决方案。
    猜你喜欢
    • 2017-09-13
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 2014-09-04
    • 2013-05-26
    • 2015-06-15
    • 2021-01-11
    • 1970-01-01
    相关资源
    最近更新 更多