我目前在申请中面临噩梦。我有1个服务和1个工厂,他们需要互相访问,如下:
// Dependency Injection
MyFactory(MyService)
MyService(MyFactory)
这使我的应用程序中断(但在控制台上没有错误)。我不知道最新情况,然后我需要彼此沟通。
任何?
答案 0 :(得分:3)
答案 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作为调解员。这很公平。