2017-06-13 40 views
2

我有項目,使得使用材料2的(「@角/材料」:「^ 2.0.0-beta.6」)爲什麼從Material2中刪除了forRoot()以及我如何處理延遲加載的功能模塊?

其中根據文檔here指出MaterialModule被移除和forRoot ()已被壓扁。我知道拆分模塊以確保適當的樹狀搖擺的思考過程,但爲什麼要刪除subModules中的forRoot呢?

考慮這種使用情況下

兩個模塊依賴相同的材料的子模塊等OverlayModule上。 注意:此材料模塊有其自己的提供者。

  • 模塊一是懶加載的。
  • 模塊二急切地加載。

我應該如何構建我的新AppSpecificMaterialModule,以便我還可以提供所有材質的提供者並防止提供者單例的重複?我是否需要注意我的應用程序最終會消耗的具體提供商,然後自己在appModule級別提供?有點像描述的那樣here

回答

2

forRoot()方法已被刪除,因爲Angular Material團隊找到了一個新的解決方案來確保給定的提供者是單例。

在創建材料提供者之前,有一個提供者工廠檢查是否已經有給定提供者的實例。

如果工廠找到了祖先供應商,它會使用現有供應商。如果沒有類似的提供者已經實例化,它只會創建一個新的實例。

的正式提案已經提交對角庫:https://github.com/angular/angular/issues/13854

這裏是角材料,鏈接到一個例子供應商工廠: https://github.com/angular/material2/blame/master/src/lib/core/a11y/live-announcer.ts#L86-L94

基本上以下行試圖注入任何其他現有LiveAnnouncer提供者實例(跳過自己)到工廠

[new Optional(), new SkipSelf(), LiveAnnouncer] 

工廠函數然後獲取任何現有的LiveAnnouncer實例作爲工廠中的DI參數,如果存在實例,則只返回現有實例。

否則它只會創建一個new LiveAnnouncer(XXX)實例。

export function xxxFactory(parentAnnouncer: LiveAnnouncer) { 
    return parentAnnouner || new LiveAnnouncer(XXX); 
} 

如何構建項目

給予回答你的問題。基本上你應該能夠再次使用不同的組件模塊(不需要關心根&孩子)

相關問題