2017-02-17 125 views
1

這裏是我的plunker:https://plnkr.co/edit/QPqciUngXeby2uECbokx?p=preview (您可能需要點擊停止和運行幾次才能正常加載)爲什麼當[值]改變時更改檢測不會在這裏發生?

表沒有改變。

但是當你把

changeDetection: ChangeDetectionStrategy.OnPush 

出,該表的變化。

我的理解是,在OnPush中,當@Input發生變化時,變化檢測將觸發。在這種情況下,@Input是[value],鏈接到this.testData。

爲什麼它沒有改變?

回答

1

因爲用onPush更改檢測在更改輸入或處理了收聽的事件時運行。

如果更改this.testData,則更改檢測需要運行以更新[value]="testData"綁定。如果發生這種情況,更改檢測將運行<p-dataTable>,因爲它的輸入已更改。

App沒有任何輸入已更改,因此沒有更改檢測。

可以使用ChangeDetectorRef.markForCheck()

Plunker example

+0

標記App的檢查,因此它看起來像角停止監聽在子級別@input變化時,根用OnPush,是正確的?當我使用'[value] =「testData $ | async」'時,表更新,異步管道是否自動添加markForCheck? – techguy2000

+0

你的解釋有點落後。需要對「App」組件運行更改檢測,然後在識別出更改時更新模板中的綁定。當組件使用'OnPush'時,'setTimeout()'不會導致變更檢測運行。這是''的'@Input()'被更新的時候。如果''使用'OnPush',則會導致爲''運行更改檢測。每次'testData $'發出事件時,'async'都會導致在''中運行變更檢測。希望這可以幫助。 –

+0

我原來的理解是,當你的答案是當App使用OnPush時,App下的任何組件都會繼承OnPush策略。那是對的嗎?而[值]是中的@Input(),對不對?因此,在我原來的帖子中,中的@Input()已更改,但表未刷新。所以看起來像Angular在父級別檢測到沒有變化時忽略子級別的@Input()更改。我在這裏使用一個簡單的組件而不是p-dataTable:https://plnkr.co/edit/xMu3km7XqvdT2pqCjRmi?p=preview – techguy2000

相關問題