2017-06-30 103 views
1

請看下面的例子:Angular 2+中依賴注入昂貴嗎?

@Directive({ 
    selector: '[testActiveTab]' 
}) 
export class ActiveTabDirective { 

    @Input('testActiveTab') active: boolean = true; 

    constructor(
     private parent: TabbedContainerComponent, // <-- 
     private child: TabComponent    // <-- 
    ) { 
    } 

    // ... 

} 

使用模板:

<test-tabbed-container> 
    <test-tab> 
     <!-- ... --> 
    </test-tab> 

    <test-tab testActiveTab> 
     <!-- ... --> 
    </test-tab> 
</test-tabbed-container> 

正如你可能已經猜到,這個指令是用來標記選項卡式容器組件內部的活動標籤。

可能的問題,但是,是每一個創建ActiveTabDirective的一個實例時,噴射器將播種parentchild屬性重新,意思,即如果有n突片在容器中,2 * n初始化將發生

問題:

依賴注入在Angular2 +一個昂貴的操作?還是僅僅通過參考,因此便宜?

+1

「如果容器中有n個選項卡,則會發生2 * n個初始化」,但並非總是如此。 DI也是關於生命週期管理的,所以根據配置,只有引用會被傳遞,並且不會創建新的實例 –

回答

2

這裏的「昂貴」解決了hierarchical dependency injection在Angular中工作的方式,並且性能影響是結果。

DI無法實例化並注入未鏈接到已編譯元素的組件。

提供者是單身人士(在當前的注射器範圍內)。如果提供者沒有在當前的注入器中定義,但是在父注入器中實例化,則注入現有的提供者實例。

雖然InjectableDirectiveComponent類是所有注射劑,角清楚地區別定期提供者(在providers定義)指令/組件(在declarations定義),和它們的行爲是不同的。指令/組件由編譯器實例化,所以額外的實例不會被意外注入。

constructor(
    private parent: TabbedContainerComponent, 
    private child: TabComponent 
) {} 

將注入現有的組件實例或拋出,如果沒有。如果「孩子」實際上是「自己」,因爲孩子還沒有編譯,如果需要的話,應該用ViewChildContentChild進行檢索。