Angular Form Validations - 值必须与初始值不同

标签 angular validation typescript

我的响应式(Reactive)表单验证设置如下:

  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 属性,只要我输入一些东西,dirty 就是真的,如果我输入与初始值相同的值也是如此。我想要一个属性,告诉我 one 输入值是否不等于初始值。这是开箱即用的,还是我必须检查每个 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();

关于Angular Form Validations - 值必须与初始值不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46667375/

相关文章:

typescript - 用 typescript 从 Protractor 发送电子邮件

typescript - 使用 Angular 4 Pipes 或 Rxjs 运算符对对象数组 (json) 中的属性值进行分组/求和

validation - Flutter FormBuilder Dropdown 验证不起作用

PHP 验证并将信息存储到 session 变量中

typescript - 为什么我必须使用 "new BrowserWindow"而不是 "new Electron.BrowserWindow"实例化 Electron.BrowserWindow ?

javascript - Angular 2 - 自定义表单控件 - 禁用

php - 通过类型转换验证用户输入

angular - 如何停止在自动完成组件中添加重复的芯片?

angular - 如何在不弄乱下拉值的情况下使 Angular Reactive Formarray 中的级联下拉列表工作

Angular 6 - 使用延迟加载模块时出现 react 形式问题