AngularJS:注入参数和$injector的区别

AngularJS: difference between injection parameter and $injector

就像这个人 posted here 一样,我使用 Angular Material 的 $md-toast 服务在 API 调用 return 错误时通知用户。我得到 "Circular dependency found" 并找到了(之前引用的)文章。

有什么区别

  .factory('toastHttpInterceptor', function ($mdToast) {
    return {
      responseError: function(response) {
        $mdToast.showSimple('Error');
      }
    };
  });

  .factory('toastHttpInterceptor', function ($injector) {
    return {
      responseError: function(response) {
        var $mdToast = $injector.get('$mdToast');
        $mdToast.showSimple('Error');
      }
    };
  });

??第二个如何解决"Circular dependency found"问题?

第二个删除循环依赖,因为加载模块时,首先解析对工厂的调用,因此模块理解:

toastHttpInterceptor <- injector

而直接或间接地,您的 mdToast 将具有此依赖路径:

mdToast <- ... <- toastHttpInterceptor

但是当该代码被单独调用时,mdToast 被 lazily 解析。你得到引用 lazily 所以你可以使用它,直到你需要它时才获得它,相反在定义时获得它。

所以:

  1. 加载时,避免在注入定义上有圆形路径。这样的注入会被整体处理,可能会失败。
  2. 修复涉及您知道 $mdToast 将存在,尽管未指定为依赖项(因为您不能),并在代码执行中询问它(这将是 初始化;模块及其部分已经加载)。