2016-01-26 56 views
3

我一直在Angular2中試驗動態組件加載器。可能與此有關的一個問題:https://github.com/angular/angular/issues/4330似乎是,一旦組件加載了loadIntoLocation()函數,注入器就無法找到父組件的注入器或注入其中的東西。如該文章所示,您可以將從父級注入器(Injector.resolve)獲取的已解析提供程序數組傳遞到loadIntoLocation()的最後一個參數。Angular2:動態組件加載器和注入

這似乎最初工作,但我也發現,動態加載組件的任何兒童也有同樣的問題。孩子們的噴油器不知道要查找的注射樹提供商,所以一個標準的注射在孩子的構造類似

constructor(myComponent: MyComponent) 

不起作用。孩子們(動態加載組件)不是動態加載,但只是「正常」使用模板實例,選擇等,我想知道:

  1. 這是(仍然)一個已知的問題還是我誤會什麼了嗎?
  2. 如果一個已知問題在子級別有任何解決方法?我嘗試了上面的構造函數,還使用@Host,並使用了forward ref + @host,但都沒有工作。是否有另一種方法來手動將綁定傳遞給未動態加載的組件?
  3. 有沒有其他可能的解決方法呢?

回答

0

這些問題似乎是由解決的供應商傳遞給loadToLocation()引起的。 DI是分層的,DI試圖通過迎面根層次來解決所需的類型,但環比在loadToLocation()打破,因爲有供應商傳遞的,而不是一個孩子注射器。
動態添加的組件及其孩子只能解決傳給loadToLocation()或列在動態添加的組件本身的providers名單供應商(或其子女之一,如果它是一個(grand-)實際解決組件的母公司)。

當DI從動態插入樹中向上走,以解決依賴性,迭代在由loadToLocation()添加的組件停止,因爲該組分的噴射器不具有父注射器(這將是主機的噴射器組件,其中添加了動態添加的組件)。

另見本https://github.com/angular/angular/issues/5990

+1

感謝您的聯繫 - 它似乎有一些更多的想法去嘗試。根據我的經驗,需要明確的是,動態加載不僅會導致注入樹被破壞,而且動態加載的組件的所有後續子組件都無法在它們的樹上行走(這與您所說的有點不同)。每個孩子似乎都被放置在自己的注射器樹中。因此,列出的工作需要以某種方式重複爲每個孩子站不住腳。高興地被證明是錯誤的...我會看看你的鏈接,看看我能否得到它的工作。非常感謝。 –

+0

我沒有詳細調查。如果這是你說的那麼我認爲這是一個錯誤,應該報告。該樹被破壞的動態添加元素是顯而易見的,但我想這將被修復。 –

0

修正。我已經將我的代碼中的另一個問題與我認爲是上述錯誤的問題混淆了。我動態加載的組件的孩子是從抽象類派生的。我試圖注入抽象類到孩子,而不是實際執行它,每本

Interface based programming with TypeScript, Angular 2 & SystemJS

我已經學會了,你不能這樣做。注入樹在動態負載(我認爲應該糾正)時確實會破壞,但是我收回了關於其後無法遍歷自己的樹的部分。感謝評論 - 它幫助我整理出來。