2017-05-11 28 views
3

我需要在運行時動態創建多個組件的實例。角動態組件加載 - ExpressionChangedAfterItHasBeenCheckedError

我在網上找到了幾個例子,包括StackOverflow和angular.io頁面本身。

但是在向組件模型賦值時總是收到異常ExpressionChangedAfterItHasBeenCheckedError。

即使該功能的專用例子拋出同樣的異常: Angular.io article Plunker

Error錯誤:ExpressionChangedAfterItHasBeenCheckedError:它檢查後表達發生了變化。先前的值:'未定義'。當前值:'Bombasto'。看起來這個視圖是在它的父母及其子女被骯髒檢查後創建的。它是否在變化檢測鉤子中創建?

我應該忽略這個還是應該修復?

+0

這是新手錯誤:)。在已經*檢查*之後,不要手動更改組件的狀態。請參閱http://stackoverflow.com/q/34364880/573032 –

+0

thx球員,將看看它。 Rusev解決了實際的錯誤 –

+0

[關於'ExpressionChangedAfterItHasBeenCheckedError'錯誤需要知道的一切](https://medium.com/@maximus.koretskyi/everything-you-need-to-know-about-the-expressionchangedafterithasbeencheckederror-error -e3fd9ce7dbb4)很詳細地解釋了這種行爲 –

回答

6

這是因爲您正在更改ngAfterViewInit中的組件狀態。討論行爲見issue here

在你的情況下,你可以移動最初的創建在ngOnInit

ngOnInit() { 
    this.loadComponent(); 
    this.getAds(); 
} 

https://plnkr.co/edit/vAbkBIqrhpuuWadO4zGD?p=preview

+0

非常感謝,解決了這個問題。沒有預料到直接在Angular文檔中發現這樣的關鍵功能 –

+1

其實這不是一個錯誤,而是一個預期的行爲 - 非常惱人的:)。 – rusev

+0

目前關於動態組件加載的官方示例包含該錯誤https://angular.io/generated/live-examples/dynamic-component-loader/eplnkr.html - 此解決方案也適用於此 –

2

在更一般的情況下

使用

this._changeDetectionRef.detectChanges(); 

在那個那樣更新到晚期組件狀態的方法的結束時,

..不要忘記加

private _changeDetectionRef : ChangeDetectorRef 

作爲擁有您的方法的Component構造函數的參數。

查看discution here