angular2 表单 + 异步验证 + ChangeDetectionStrategy.OnPush = 没有视图刷新?
angular2 form + async validation + ChangeDetectionStrategy.OnPush = no view refresh?
[angular2 RC4 + @angular/forms模块]
我有一个组件使用 OnPush
包含 FormGroup
的变化检测。
此表单包含一个 FormControl
和一个 async
验证器。
验证完成后(不再pending
),视图不会刷新。
只有 input
模糊事件使视图刷新..
如果我删除 OnPush
更改检测,它会正常工作。
是 angular 错误还是我做错了什么?
看来您没有实现使用 ChangeDetectionStrategy.OnPush
的目标。
您的组件上没有任何@Input 属性 或 | async
管道,但它只是使用此策略更新视图状态的要点 - 当 Input 属性更新(理想情况下有一个新对象)。所以在当前情况下去掉它
更新
如果您在这种情况下仍然坚持使用 OnPush,对于预期的行为,您应该手动触发更改检测。
添加 import {..., ChangeDetectorRef} from '@angular/core';
并在构造函数中注入它的实例。
在你的方法中你必须添加这个:
uniqueNameAsync(control: FormControl): Promise<{[key: string]:any}>{
return new Promise(resolve => {
setTimeout(() =>{
resolve(null);
this.changeRef.markForCheck();
}, 500);
});
}
[angular2 RC4 + @angular/forms模块]
我有一个组件使用 OnPush
包含 FormGroup
的变化检测。
此表单包含一个 FormControl
和一个 async
验证器。
验证完成后(不再pending
),视图不会刷新。
只有 input
模糊事件使视图刷新..
如果我删除 OnPush
更改检测,它会正常工作。
是 angular 错误还是我做错了什么?
看来您没有实现使用 ChangeDetectionStrategy.OnPush
的目标。
您的组件上没有任何@Input 属性 或 | async
管道,但它只是使用此策略更新视图状态的要点 - 当 Input 属性更新(理想情况下有一个新对象)。所以在当前情况下去掉它
更新
如果您在这种情况下仍然坚持使用 OnPush,对于预期的行为,您应该手动触发更改检测。
添加 import {..., ChangeDetectorRef} from '@angular/core';
并在构造函数中注入它的实例。
在你的方法中你必须添加这个:
uniqueNameAsync(control: FormControl): Promise<{[key: string]:any}>{
return new Promise(resolve => {
setTimeout(() =>{
resolve(null);
this.changeRef.markForCheck();
}, 500);
});
}