2017-07-16 35 views
5

我把重点元器件上的开发工具,可以做到以下几点:Angular:如何通过控制台获取组件依赖性?

ng.probe($0) 

以获得特殊对象“DebugElement”。现在,我们可以得到它的喷油器:

ng.probe($0).injector 

现在我想得是这个组件上定义的扶养。依赖的定义就像一个班级,所以我应该这样做:

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

但是!服务未在控制台范围中定义。 如果我让一个字符串:

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

显然也不起作用。

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

+0

@yurzui,你会使其与一些解释回答得依赖? :) –

回答

3

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

角保持组件内声明的供应商在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获取关于提供给当前节点

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')) 

参见

+0

看到你的评论,只是想我会在早上答复) –