AngularJS服务互相注入导致无限循环

时间:2016-01-29 12:32:01

标签: javascript angularjs dependency-injection angularjs-service angularjs-factory

我目前在申请中面临噩梦。我有1个服务和1个工厂,他们需要互相访问,如下:

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

这使我的应用程序中断(但在控制台上没有错误)。我不知道最新情况,然后我需要彼此沟通。

任何?

3 个答案:

答案 0 :(得分:3)

您创建了循环依赖,这是错误的。

我从AngularJS的作者Miško那里找到了一个关于这个问题的article

为了解决这个问题,你可以使用第三个可以用作调解员的服务

答案 1 :(得分:1)

除了递归算法(我假设你不在这里处理递归),你不能有循环依赖,这不是一个角度限制。

如果没有看到代码,我会说你有几个选择

1)从另一个中重复功能,使它们不再相互依赖。

2)合并这两项服务(可能无法或不合适)

3)将功能拆分为更多服务/工厂以打破循环依赖。

答案 2 :(得分:0)

通常说循环依赖是一个设计问题而且确实如此,但有时处理它只是更简单。但是,如果您无法控制它,某些情况会使您有一个特殊情况。

我曾经有一个循环依赖:这是因为$ http拦截器上的配置使用$ state of ui-router重定向到登录页面。 ui-router对$ http有依赖。

所以,如果你确定你正在做什么,那么有几种方法

1-在myService构造函数中,调用myFactory.setMyService(this)。

2-在myService中执行一个getter函数,它将查找一个字段myFactory,它已被初始化。如果没有调用$ injector.get(“myFactory”);

3-对于需要循环依赖的每个函数:使用如下定义的内部函数:

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

4-在module.run函数中实例化两个服务(没有它们的相关性)并为每个服务设置一个字段:

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

第1点和第1点2必须只在其中一个中完成。 必须在两者中使用第3点/ 第4点是在你需要实际服务之前设置dependecies(希望你在之前运行的module.run中不需要它们。

编辑:关于在接受的答案中用作调解员的第三方服务 - >我更喜欢使用$ injector作为调解员。这很公平。