2017-07-16 98 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

看到你的評論,只是想我會在早上答覆) –