2016-07-20 27 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'时异步“,这在这种情况下是不可能的。我也认为你需要手动调用变更检测。 –