2

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

 ng.probe($0)

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

 ng.probe($0).injector

现在我想获得一个在这个组件上定义的依赖。依赖被定义为一个类,所以我应该这样做:

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

但!服务未在控制台范围内定义。如果我把它变成一个字符串:

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

显然它也不起作用。

我正在尝试对ReflectiveInjector.get进行逆向工程,但现在没有运气。有任何想法吗?

4

1 回答 1

2

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

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 来获得依赖。

在此处输入图像描述

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

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,令牌在providerTokens数组中可用。

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

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

也可以看看

于 2017-07-17T04:03:55.697 回答