2016-07-20 65 views
5

[angular2 RC4 + @角/表格模塊]angular2窗體+異步驗證+ ChangeDetectionStrategy.OnPush =無視圖刷新?

我有使用含有FormGroupOnPush變化檢測的成分。 此表格包含一個FormControl和一個async驗證程序。

驗證完成後(不再更多pending),視圖不刷新。 只有input模糊事件使視圖刷新..

如果我刪除OnPush更改檢測,它工作正常。

This plunker demonstrates it

它是一個角度錯誤還是我做錯了什麼?

回答

5

看起來你錯過了使用ChangeDetectionStrategy.OnPush的目標。

您的組件上沒有任何@Input屬性或| async管道,但它只是使用此策略更新視圖狀態的一點 - 當更新Input屬性時(理想情況下爲新對象)。所以只要擺脫它當前的情況下

UPDATE

如果你還是堅持在這種情況下使用OnPush,爲預期的行爲,你應該手動觸發變化檢測。

添加import {..., ChangeDetectorRef} from '@angular/core';並在構造函數中注入它的實例。

在你的方法,你必須補充一點:

uniqueNameAsync(control: FormControl): Promise<{[key: string]:any}>{ 
    return new Promise(resolve => { 
     setTimeout(() =>{ 
      resolve(null); 
      this.changeRef.markForCheck(); 
     }, 500); 
    }); 
} 
+0

有了'OnPush',刷新視圖是觸發過當事件發生像點擊或輸入打字的組件中。在plunker中,當你開始輸入時會刷新視圖(出現'pending')。同步驗證工作正常..所以我不知道我是否可以認爲它像正常行爲或與異步驗證程序錯誤.. – bertrandg

+0

好的,所以如果你仍然堅持在這種情況下使用OnPush,對於預期的行爲,你應該觸發手動更改檢測。 從'@ angular/core'添加'import {...,ChangeDetectorRef};'並在構造函數中注入它的實例。 在你的方法必須添加這樣的: '的setTimeout(()=> { 決心(空); this.changeRef.markForCheck();} ,500)' –

+1

異步執行僅調用變化檢測在''使用'OnPush'時異步「,這在這種情況下是不可能的。我也認爲你需要手動調用變更檢測。 –