5

我正在創建一個組件。由於我喜歡Apache Wicket的做事方式,我試圖模仿傳遞數據的方式。爲此,對於子組件,我傳遞了一個模型和回調函數,它們可以提取相關的值,而不是調用函數來獲取數據。Angular2:如何讓@Input setter按特定順序調用?

問題是,新設置的模型的處理使用回調。 因此,如果在設置回調之前調用模型設置器,則會導致Angular崩潰。
解決方法:將需要回撥的操作推遲到ngAfterViewInit()等。

簡而言之:

  • 我如何控制其中@Inputs設定的順序?
  • 我可以依賴源代碼中的順序嗎?

例子:(此處更改順序,似乎做的工作)使用該子組件

@Input() 
valueCallback: (item: any) => string 
    = app => { throw new Error("valueCallback not yet defined."); }; 

@Input() 
labelCallback: (item: ItemType) => string; 

模板:(這裏改變的順序不改變順序)

  <wu-checkboxes [groupName]="'includedApps'" 
          [options]="availableApps" 
          [valueCallback]="appsValueCallback" 
          [labelCallback]="appsLabelCallback" 
      > 

正如我在上面提到的,Angular2似乎遵循@Input類成員的順序,並按順序設置/調用它們。問題是,這是事實上的還是法理上的?我不想依賴那些僅僅因爲它目前是以這種方式進行編碼的功能。我對JavaScript反射知之甚少,所以我無法分辨這是否會在任何地方發揮作用。

回答

3

您可以使用ngOnChanges(),每次通過更改檢測更新@Input()時會調用該函數。您可以在ngOnChanges內檢查是否所有輸入值已經可用,然後執行您的代碼。 儘管如此,後續更新不會再次觸發函數調用(如果不需要),您需要謹慎。

更新

綁定(值綁定和事件綁定)的順序是不確定的Angular2,因此,你可以不依賴特定的順序。

+0

感謝您的提示。這就是'ngAfterViewInit()或'這樣'的意思,並且希望避免。它需要相當多的樣板代碼,恐怕很容易出錯。 –

+0

沒有指定的輸入順序,因此不太可能避免它。 –

+0

聽起來沒錯。如何把它放到答案中,我會接受 –