离子:[$ injector:cdep]找到循环依赖

时间:2016-10-13 11:19:30

标签: angularjs ionic-framework factory

.factory函数中发生该错误。在我的项目中,我有两个.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< - Factory_B< - 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

以下是方案3的demo 显示了我如何使用工厂模拟项目流程。感谢。

2 个答案:

答案 0 :(得分: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;
      }
  }
});

答案 1 :(得分:1)

我假设您正在询问如何避免循环依赖。

在这种情况下,您可以注入$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()
         }

     }
})