網站搜尋

typescript - 在從 Angular 6.1 更新到 9 後,@Input() 帶有 null 值


在子元件中使用 @Input() 有什麼變化嗎?我的某些子元件會取得 null 值,但如果我把 IvyCompiler 設為 false,它們就會重新正常工作並接收值。我在文件中讀到這個,但對我來說,關於 @Input() 和在子元件中的使用有什麼變化還不是很清楚:

指令的未綁定輸入(例如 name in )現在會在檢視創建時設置,且在變更檢測運行之前(以前,所有輸入都是在變更檢測期間設置的)。

https://angular.io/guide/ivy-compatibility#changes-you-may-see

答案#1

就像我在我的元件中已經提到的那樣。你的元件的輸入在設定器中彼此相互依賴。例如,你有這段程式碼:

@Input()
set show(show: boolean) {
  if (show === true && this.action === "update") {
    this.exchange();
  }
  this._show = show;
}

在組件創建時,輸入實際上有一個特定的設定順序。我記不起哪個屬於哪個版本,但他們在 ivy 中確實改變了這種行為。所以它要麼取決於你在父模板中定義的順序,要麼取決於輸入在組件本身中定義的順序。

但如我之前提到的,你的程式碼不應依賴於這種行為,你應該將這個邏輯移到 ngOnChanges 鉤子中。這個鉤子會先被調用,甚至在 ngOnInit 之前。在這裡,你可以確定父模板中定義的所有輸入都已被設置。這將把你的程式碼改為:

ngOnChanges(changes: SimpleChanges): void {
  // here both `show` and `action` input will be set at the first `ngOnChanges` call  
  if (changes.show && this.show && this.action === 'update') {
    this.exchange();
  }
}

請注意,這僅會在 show 輸入從外部變更時被調用,而不是來自組件自身。為此,您需要更改組件的邏輯,手動檢查操作是什麼並調用 exchange()