我的表单预先填写了user.email
。我希望仅在用户使用原始FormControl
以外的值填充user.email
字段时才启用编辑按钮。是否可以使用自定义验证器执行此操作?
这是我的验证员:
import { FormControl } from '@angular/forms';
export class ChangedValidator {
static isValid(control: FormControl): any {
let initialValue = (' ' + control.value).slice(1);
if(initialValue === control.value){
return {
"changed": true
};
}
return null;
}
}
目的是克隆FormControl.value
,但我意识到每次在FormControl中更改值时都会实例化此类。
编写无法使用的代码的一种非常黑客的方法是从存储它的数据user.email
中获取provider
,并使用它来与FormControl.value
进行比较。正如您可能猜到的那样,验证器仅适用于User
对象的参数,而不适用于任何其他参数。
我想编写一个通用Validator
来检查表单的当前值是否与初始化的值不同。
修改
这是使用pristine
进行此操作的方法,但它并不完美。
import { FormControl } from '@angular/forms';
export class ChangedValidator {
static isValid(control: FormControl): any {
if(control.pristine){
return {
"unchanged": true
};
}
return null;
}
}
答案 0 :(得分:1)
如果您需要检查事物是否已从初始值发生变化,而不仅仅是控件不再是原始状态;如同,它可以返回到它的初始值,你不想要错误,然后你可以实现验证功能,如下所示:
static isValid = (initialValue: any): any => {
return(control: FormControl) => {
console.log(control.value);
if(JSON.stringify(initialValue) !== JSON.stringify(control.value)) {
return {
"changed": true
};
}
return null;
}
}
请注意,这是一个quick and dirty object check,custom validators with parameters上已经有答案,并且对custom validation as a function factory有一个解释,但对细节有点不了解。
forbiddenNamevalidator工厂返回已配置的验证程序 功能。该函数接受Angular控件对象并返回 如果控制值有效或验证错误,则为null 宾语。验证错误对象通常具有其属性 name是验证密钥(' forbiddenName'),其值为 我们可以插入错误的任意值的字典 消息({name})。
这里是playground