2016-02-24 52 views
22

我需要一些jQuery代碼在我的Angular組件視圖初始化以將數值轉換爲星號後運行。Angular2 ngAfterViewInit何時被調用?

我把代碼放在ngAfterViewInit函數中,但它沒有做我所需要的。我在函數中設置了一個斷點,並且我發現組件的大部分HTML都沒有在調用ngAfterViewInit函數的時候加載。未加載的部分使用* ngFor指令生成。

如何讓我的代碼在該指令生成所有需要操作的html後運行?

+0

請看: http://stackoverflow.com/questions/15458609/execute-function-on-page-load – Belakorr

+0

意見:'componentDidMount'是一個更簡單的抽象https://facebook.github.io /react/docs/component-specs.html只有在兒童被調用後纔會被調用。 NgFor不是一個概念,因爲你只是使用簡單的JavaScript [] .forEach' – basarat

回答

16

什麼時候ngAfterViewInit被調用?

ngAfterViewInit()應在組件的視圖及其子視圖被創建後調用。我對此進行了測試,發現兒童的ngAfterViewInit()在父母的ngAfterViewInit()之前被調用。

當你說「我的組件的大部分HTML甚至沒有加載」,你是什麼意思的「加載」? HTML組件的模板中是HTML還是通過其他方式加載(或生成)的?

如何讓我的代碼在該指令生成所有需要操作的html後運行?

這將有助於查看指令代碼。如果指令以某種方式生成未包含在Angular模板中的HTML,則可能需要手動觸發事件(例如,使用輸出屬性)以在呈現完成時通知父級。或者你可以使用setTimeout()(但那不可靠)。

我需要一些jQuery代碼在我的Angular組件視圖初始化以將數值轉換爲星號後運行。

你從哪裏得到這些數值?如果它們是從服務器動態加載的,則可以在數據到達時觸發事件,並在該點更新視圖。

此外,爲什麼不編寫一個組件,它將一個數字作爲輸入屬性並使用NgFor生成星星?

19

我一直在使用ngAfterViewChecked,當我依靠準備好的DOM。

import {Component, AfterViewChecked} from '@angular/core'; 

export class Spreadsheet implements AfterViewChecked{ 

    ngAfterViewChecked(){ 

    } 
} 
+0

爲我工作ngAfterViewInit失敗只是因爲厄運沒有準備好那裏 – baaroz

+13

請記住'ngAfterViewChecked'可以被調用多次。 –

+1

我一直在這樣做,因爲我需要一些代碼在模板的ngFor中加載了一些HTML元素後執行。顯然這不是最好的解決方案,因爲我現在至少有兩個標誌(例如componentsInitialized,searchComponentsInitialized)來確保我只在ngAfterViewChecked中執行一次相應的代碼。我真的很想知道做這件事的正確方法是什麼。 – Jort