【问题标题】:Ionic: [$injector:cdep] Circular dependency found离子:[$injector:cdep] 找到循环依赖
【发布时间】:2016-10-13 11:19:29
【问题描述】:

该错误发生在 .factory 函数中。在我的项目中,我有 2 个.factory,它们都相互使用。下面是我的控制器:

.controller('MyCtrl', function($scope, Factory_A) {
  $scope.do = function(){
      Factory_A.do_A();
  };
})

场景 1:

.factory('Factory_A', function(Factory_B){

  var value_A = 1;

  return{
    do_A: function(){
      if(value_A == 1){
        value_A++;
        Factory_B.do_B();
      }

      else{
        return "Success"
      }
    }
  }

})

.factory('Factory_B', function(Factory_A){

    var value_B = 0;

    var do_B_1 = function(){
      Factory_A.do_A();
    };

    return{
      do_B: function(){
        value_B++;

        if(value_B > 0){
          do_B_1();
        }

        return true;
      }
  }
}); 

错误:[$injector:cdep] 找到循环依赖:Factory_A

场景 2:

.factory('Factory_A', function(){

  var value_A = 1;

  return{
    do_A: function(){
      if(value_A == 1){
        value_A++;
        Factory_B.do_B();
      }

      else{
        return "Success"
      }
    }
  }

})

.factory('Factory_B', function(Factory_A){

    var value_B = 0;

    var do_B_1 = function(){
      Factory_A.do_A();
    };

    return{
      do_B: function(){
        value_B++;

        if(value_B > 0){
          do_B_1();
        }

        return true;
      }
  }
});

错误:Factory_B 未定义

场景 3:

.factory('Factory_A', function(Factory_B){

  var value_A = 1;

  return{
    do_A: function(){
      if(value_A == 1){
        value_A++;
        Factory_B.do_B();
      }

      else{
        return "Success"
      }
    }
  }

})

.factory('Factory_B', function(){

    var value_B = 0;

    var do_B_1 = function(){
      Factory_A.do_A();
    };

    return{
      do_B: function(){
        value_B++;

        if(value_B > 0){
          do_B_1();
        }

        return true;
      }
  }
});

错误:Factory_A 未定义

这里是 场景 3demo,展示了我如何使用工厂模拟我的项目流程。谢谢。

【问题讨论】:

  • 那么...问题是什么?只是不要创建相互依赖的服务。什么是 A 和 B 以及为什么他们应该使用彼此的方法并不明显。在 SO 上已经有很多关于这个主题的已回答问题,并且可能的解决方案的数量非常有限。

标签: angularjs ionic-framework factory


【解决方案1】:

使用$injector 在自身或循环依赖上注入依赖运行时。

完整示例代码

在您的演示页面中更改您js

angular.module('ionicApp', ['ionic'])

.controller('MyCtrl', function($scope, Factory_A) {
  $scope.do = function(){
      Factory_A.do_A();
  };
})

.factory('Factory_A', function($injector){

  var value_A = 1;

  return{
    do_A: function(){
      if(value_A == 1){
        value_A++;
        var Factory_B = $injector.get('Factory_B');
        Factory_B.do_B();
      }

      else{
        return "Success"
      }
    }
  }

})

.factory('Factory_B', function($injector){


    var value_B = 0;

    var do_B_1 = function(){
      var Factory_A = $injector.get('Factory_A');
      Factory_A.do_A();
    };

    return{
      do_B: function(){
        value_B++;

        if(value_B > 0){
          do_B_1();
        }

        return true;
      }
  }
});

【讨论】:

  • 非常感谢。这其实是我想要的。
【解决方案2】:

我假设您问的是如何避免循环依赖。

在这种情况下,您可以注入 $injector。然后在调用每个工厂内部的方法时,你在那个时候注入它们在第一次使用后缓存它们。

.factory( 'FactoryA', function($injector){
     return {
         funcFoo: function(){
              var fb = $injecto.get('FactoryB')
              fb.funcBar()
         }

     }
})

.factory( 'FactoryB', function($injector){
     return {
         funcFoo: function(){
              var fa = $injecto.get('FactoryA')
              fa.funcFoo()
         }

     }
})

【讨论】:

  • 非常感谢@jusopi。这其实是我想要的。
猜你喜欢
  • 2018-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-12
  • 2021-10-02
  • 1970-01-01
相关资源
最近更新 更多