2017-08-27 61 views
0

我有一個名爲'data'的對象的父組件,其中包含一些我想要在UI上顯示的數據。數據顯示在一個表格中,並且我創建了一個包含該表格的子組件。因此,在調用表組件時,我將數據作爲@Input()傳遞。將數據推送到輸入()未檢測到:角4

//父componene模板

<display-data [data]='data'></display-data> 

上顯示的頂部,我在修改該數據屬性我父組件兩種方法。其中一個是重新分配數據陣列是這樣的:

setNewData() { 
    this.data = this.response.content; 
} 

和其他方法推新數據已經存在的數據:

addNewData(newData: Array) { 
    this.data.push(...newData); 
} 

因爲我採用了棱角分明的輸入()我假設無論何時我修改父組件中的數據對象(重新賦值或添加更多數據),子組件中的數據屬性都會立即更新,我將在UI上看到新數據。這按預期工作。 但是,當我試着看Angular的生命週期鉤子'ngOnChanges'時,我注意到它只在重新分配時才被調用,而不是當我在數據對象中推入一些新數據時。

這是如何ngOnChanges的作品?因爲我想在子組件中的數據發生更改時調用方法。

+0

另一種方法是將源數組中的每個項目傳遞給單個組件@Input()以跟蹤每個項目的更改。而不是整個陣列。 –

回答

0

是的,這正是ngOnChanges的工作原理。

只有在重新分配發生時纔會調用ngOnChanges。

如果您希望在數據更改時執行方法,您可以執行以下操作。

  1. 使用成員變量數據創建一個服務,並返回一個返回該變量的函數。
  2. 父組件可以使用此服務的方法來獲取和更新此變量。
  3. 服務還包含一個事件發射器對象,它可以由子組件訂閱。
  4. 所以,現在無論父組件調用服務方法來更新數據的值,都可以這樣做,並且還會在EventEmitter對象上發出。

讓我知道你是否想要某種代碼。但是如果你自己編碼,你會理解很多。

+0

謝謝阿曼。即使我曾想過爲父母和孩子的組件交流做同樣的事情,但只是想對ngOnChanges()進行一些澄清。我想我會創建一個服務,而不是使用輸入進行通信。再次感謝! – Aiguo

+0

很高興我能幫忙:) –