Angular:如何通过控制台获取组件依赖关系?

标签 angular dependency-injection angular-di

我将重点放在开发工具中的组件元素上,并且可以执行以下操作:

 ng.probe($0)

获取特殊对象“DebugElement”。现在我们可以获得它的注入(inject)器:

 ng.probe($0).injector

现在我想获得在此组件上定义的依赖项。依赖关系的定义就像一个类,所以我应该这样做:

ng.probe($0).injector.get(MyService)
但是!服务未在控制台范围内定义。 如果我把它变成一个字符串:

 ng.probe($0).injector.get('MyService')

显然它也不起作用。

我正在尝试对 ReflectiveInjector.get 进行逆向工程,但目前还没有运气。有什么想法吗?

最佳答案

我们必须将 token 传递给声明的 injector.get 方法。如果我们将类声明为 token ,我们就不能使用字符串。

Angular 保留在 ngfactory 的组件内声明的提供程序 Plunker

function View_App_Host_0(_l) {
  return jit_viewDef0(0,[(_l()(),jit_elementDef1(0,null,null,2,'my-app',[],null,null,
      null,jit_View_App_02,jit__object_Object_3)),jit_providerDef4(4608,null,jit_MyService5,
      jit_MyService5,[]),jit_directiveDef6(49152,null,0,jit_App7,[],null,null)],null,
      null);
}

它使用 elementInjector 来获取依赖项。

enter image description here

DebugElement 获取有关提供给当前节点的 token 的信息

get providerTokens(): any[] {
  const tokens: any[] = [];
  if (this.elDef) {
    for (let i = this.elDef.index + 1; i <= this.elDef.index + this.elDef.childCount; i++) {
      const childDef = this.elView.def.nodes[i];
      if (childDef.flags & NodeFlags.CatProvider) {
        tokens.push(childDef.provider !.token);
      }
      i += childDef.childCount;
    }
  }
  return tokens;
}

在组件元数据的 providers 数组中声明提供程序后, token 将在 providerTokens 数组中可用。

所以我们可以通过写来获取依赖

ng.probe($0).injector.get(ng.probe($0).providerTokens
    .find(x => x.name === 'MyService'))

另请参阅

关于Angular:如何通过控制台获取组件依赖关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45132089/

相关文章:

c# - 如何在不使用服务定位器模式的情况下访问 Ninject.Kernel

angular - 正在为任何非延迟加载模块使用 @Injectable providedIn 与 providedIn : "root"? 相同

angular - NG0200 : Circular dependency in DI detected for ApplicationRef

angular - 如何在工厂提供程序中获取 QueryParam (Angular4)

json - 如何将 JSON 响应映射到 Angular 4 中的模型

android - Dagger2 注入(inject)大量 Activity/fragment/服务(可能获得大量 NPE)

typescript - Angular2 (2.0.0-beta.17) NgSwitchWhen 给出 "No provider for TemplateRef!"

java - Dagger 2 : Using factory methods in place of public constructors

angular - 使用 @Input 装饰器访问传递的数据

找不到 URL 的 Angular 2 HTTP GET 404