我的Form-validators.ts中的这个代码:

console.log('password:', password?.value);
console.log('confirmPwd:', confirmPwd?.value);

...总是获取undefined,导致自定义验证(matchPwdValidator())不断返回false.如果我在交换机中获取confirmPwd,它将打印出正确的详细信息.以下是我的代码的摘要版本.

Form-validators.ts

import { AbstractControl, ValidatorFn, Validators } from "@angular/forms";

export class FormValidators {
  ...

  static matchPwdValidator(): ValidatorFn {
    return (control: AbstractControl): { [key: string]: any } | null => {
      const password = control.get("password");
      const confirmPwd = control.get("confirmPwd");
  
      console.log('password:', password?.value);
      console.log('confirmPwd:', confirmPwd?.value);
  
      if (!password || !confirmPwd || password.value !== confirmPwd.value) {
        return { PwdNotMatched: true };
      }
  
      return null;
    };
  }
}

Form.component.ts

import { Component } from "@angular/core";
import { FormBuilder, FormGroup } from "@angular/forms";
import { FormValidators } from "../utilities/form-validators";

@Component({
  selector: "app-form",
  templateUrl: "./form.component.html",
  styleUrls: ["./form.component.scss"],
})
export class FormComponent {
  
  cpwdError: boolean = false;

  sampleForm: FormGroup;

  constructor(
    private formBuilder: FormBuilder,
  ) {
    
    this.sampleForm= this.formBuilder.group(
      {
        ...
        password: ["", FormValidators.passwordValidator()],
        confirmPwd: ["", FormValidators.matchPwdValidator()],
      },
    );
    
    ...
    this.sampleForm.get('confirmPwd')?.statusChanges .subscribe(() => {
      this.updateErrorFlags('confirmPwd');
    });
  }


  private updateErrorFlags(controlName: string): void {
    const control = this.sampleForm.get(controlName);
    if (control) {
      switch (controlName) {
        ...
        case 'confirmPwd':
          this.cpwdError = control.hasError('PwdNotMatched') && control.dirty;
          break;
      }
    }
  }
}

推荐答案

您将matchPwdValidator验证设置为"confirmPwd"FormControl.它找不到任何名称为"password"和"confirmPwd"的控件.应该从当前窗体控件的根窗体组中获取这两个控件.

const password = control.parent?.get('password');
const confirmPwd = control.parent?.get('confirmPwd');

Demo @ StackBlitz

Typescript相关问答推荐

使用前的组件渲染状态更新

如何在ts中使用函数重载推断参数类型

如何通过TypeScript中的工厂函数将区分的联合映射到具体的类型(如类)?

带占位符的模板文字类型何时扩展另一个?

有没有办法解决这个问题,类型和IntrinsicAttributes类型没有相同的属性?

在嵌套属性中使用Required

如何在typescript中设置对象分配时的键类型和值类型

如何以Angular 形式显示验证错误消息

如何将泛型对象作为返回类型添加到类型脚本中

角效用函数的类型推断

如何调整对象 struct 复杂的脚本函数的泛型类型?

ApexCharts条形图未显示最小值.负值

如何将定义模型(在Vue 3.4中)用于输入以外的其他用途

编译TypeScrip项目的一部分导致错误

为什么Typescript只在调用方提供显式泛型类型参数时推断此函数的返回类型?

将超类型断言为类型脚本中的泛型参数

TypeScrip:如何缩小具有联合类型属性的对象

基于泛型的类型脚本修改类型

递归地排除/省略两种类型之间的公共属性

如何编写一个接受 (string|number|null|undefined) 但只返回 string 且可能返回 null|undefined 的函数?