2

我在 Angular 中有一个路由架构的胆量,它将动态下载和注入 Angular 控制器和服务......控制器部分工作正常,我正在尝试通过 $route 的 .resolve 属性下载依赖服务。

现在,假设我在页面启动时在范围内声明了一个工厂,它会很好地注册并且使用它的控制器可以很好地解析,例如:

myModule.factory('MyInjectedDep', function() {
    return {};
});

....

MyController = function(MyInjectedDep)

但是,如果我尝试在“运行时”注册该依赖项(因为需要更好的短语),我会收到一个循环依赖项错误。例如:

$route.routes[routeItem.route] = {
   resolve: {
      MyInjectedDep: ['$injector', function($injector) {
          // In real code I download/eval this via $http but same behavior occurs
          myModule.factory('MyInjectedDep', function() {
              return {};
          });
      }]
   }
}

因此,当我的 Controller 启动时:

MyController = function(MyInjectedDep)

我收到循环依赖错误,但错误消息中没有依赖跟踪?

Error: Circular dependency:

任何想法表示赞赏

4

1 回答 1

1

关键是在配置时锁定 $provide。如果您在配置时获取 $provide 并维护对它的引用,则可以使用它来注册您的工厂,例如:

$provide.factory.apply(null, ['MyInjectedDep', [function() {
   return {};
]}]);

我有一个旨在执行此操作的提供程序/服务,它改编自 github 上的其他一些示例:https ://github.com/afterglowtech/angular-couchPotato 。

它主要设计为从 AMD 加载,但您可能可以将它的 registerXXX 函数与 $http 一起使用,或者至少复制其代码的相关部分。不要让存储库的大小欺骗您——实际的提供者/服务大约是一页代码https://github.com/afterglowtech/angular-couchPotato/blob/master/src/couchPotato.js

于 2013-05-29T21:03:50.073 回答