角表单验证 - 值必须是不同的初始值
问题描述:
我有设置反应形式验证如下:角表单验证 - 值必须是不同的初始值
ngOnInit(): void {
this.userForm = this.formBuilder.group({
status: {checked: this.selectedUser.status == 1},
username: [this.selectedUser.username, [Validators.required, Validators.minLength(LlqaConstants.USERNAME_MIN_LENGTH)]],
realname: [this.selectedUser.realname, [Validators.required, Validators.minLength(LlqaConstants.REALNAME_MIN_LENGTH)]],
password: ['', this.selectedUser.passhash.length > 0 ? [Validators.required, Validators.minLength(LlqaConstants.PASSWORD_MIN_LENGTH)] : null],
usercomment: [this.selectedUser.comment]
});
}
我想使提交按钮,只要一个输入值不再等于初始值。我能找到的最简单方法是:
disableSaveButton(): boolean {
return !this.userform.dirty || this.userForm.invalid;
}
我的问题与dirty
财产IST,只要我进入的东西,dirty
是真实的,另外,如果我输入相同的值作为初始值。我想有一个属性告诉我,如果一个输入值不等于初始值。这可能是开箱即用的,还是我必须检查每个userForm.value
等于this.selectedUser.someValue
?
答
我创建了一个自定义验证器来解决这个问题。
的验证:
export function oneValueHasToBeChangedValidator(values: { controlName: string, initialValue: string | number | boolean }[]): ValidatorFn {
return (form: FormControl): { [key: string]: any } => {
let sameValues = true;
for (let comparingValues of values) {
if (form.value[comparingValues.controlName] != comparingValues.initialValue) {
sameValues = false;
break;
}
}
return sameValues ? {'sameValues': {values: values}} : null;
};
}
我如何把使用它:
this.userForm = this.formBuilder.group({
status: this.selectedUser.status == 1,
username: [this.selectedUser.username, [Validators.required, Validators.minLength(LlqaConstants.USERNAME_MIN_LENGTH)]],
realname: [this.selectedUser.realname, [Validators.required, Validators.minLength(LlqaConstants.REALNAME_MIN_LENGTH)]],
password: ['', [Validators.minLength(LlqaConstants.PASSWORD_MIN_LENGTH)]],
usercomment: this.selectedUser.comment == null ? "" : this.selectedUser.comment
});
this.userForm.setValidators(oneValueHasToBeChangedValidator([{
controlName: "status",
initialValue: this.selectedUser.status == 1
}, {
controlName: "username",
initialValue: this.selectedUser.username
}, {
controlName: "realname",
initialValue: this.selectedUser.realname
}, {
controlName: "password",
initialValue: ""
}, {
controlName: "usercomment",
initialValue: this.selectedUser.comment == null ? "" : this.selectedUser.comment
}]));
this.userForm.updateValueAndValidity();
答
您可以在设置表单对象后立即缓存初始值。然后更改您的disableSaveButton
方法以检查两个值的相等性。
例如:
export class MyComponent {
initialValue: any;
constructor(private fb: FormBuilder) {
this.form = fb.group({...});
this.initialValue = this.form.value;
}
disableSaveButton() {
return JSON.stringify(this.initialValue) === JSON.stringify(this.form.value);
}
}
的禁用方法将检查如果当前形式值相同的初始值。
我已经在'this.selectedUser.someValue'的初始值。我的问题是,如果有一个更明确的“脏”属性,它会检查这个开箱即用。对不起,如果这不明确。 – RagnarLothbrok
你可以尝试使用'pristine'。如果用户没有更改UI中的值,则“pristine”将为“true”。它的对面是'脏'。所以如果你用默认值实例化你的表单组,并且在UI中还没有被修改过,我相信它会随着这些初始值被“原始”。如果表单在UI中发生变化,它就不应该是'原始'。 'pristine'的 – Lansana
和'dirty'的问题一样。例如,如果您添加了一个字母,并再次将其删除,虽然输入值和初始值相同,但“dirty”仍然为true,而“pristine”为false。我用自定义验证器解决了这个问题。 – RagnarLothbrok