我正在创建一个呈Angular 的形状, 我添加了一个确认密码字段,并且希望在密码不匹配时显示一条消息. 我try 了许多不同的方法--但都不起作用.我在控制台中添加了一条消息,它工作正常. 有没有人能帮我一下? 先谢谢你.

HTML

<form [formGroup]="form">
    <div class="form-group flex-container">

        <label for="password">Password</label>
        <input formControlName="password" id="password" 
               type="password" class="form-control">
        <div *ngIf="password?.touched && password?.invalid" class="alert alert-danger">Password is required</div>

        <label for="confirmPassword">Confirm password</label>
    <input formControlName="confirmPassword" id="confirmPassword" type="password" class="form-control">
    <div *ngIf="confirmPassword?.touched && confirmPassword?.invalid" class="alert alert-danger">Please verify your password.</div>
   <div *ngIf="form.hasError('confirmPassword', 'validate')" class="alert alert-danger">Passwords do not match.</div>

    <button id="submit" [disabled]="form.invalid">אישור</button>

</form>

TypeScript

import { Component } from '@angular/core';
import { FormGroup, FormControl, Validators } from '@angular/forms';
import { PasswordValidators } from './password.validators';

@Component({
  selector: 'customer-registration',
  templateUrl: './customer-registration.component.html',
  styleUrls: ['./customer-registration.component.css']
})

export class CustomerRegistrationComponent {
  form = new FormGroup({
    password: new FormControl('', Validators.required),
    confirmPassword: new FormControl('', [Validators.required, PasswordValidators.validate])
  });


  ngOnInit() {
    this.form.setValidators(PasswordValidators.validate);
  }


  get password() {
    return this.form.get('password');
  }

  get confirmPassword() {
    return this.form.get('confirmPassword');
  }   
import { AbstractControl, ValidationErrors, FormGroup, ValidatorFn } from '@angular/forms';

export class PasswordValidators {
  static validate(control: AbstractControl): ValidationErrors | null {
    const password = control.get('password')?.value;
    const confirmPassword = control.get('confirmPassword')?.value;

    if (password !== confirmPassword) {
      console.log("passwords do not match");
      return { confirmPassword: true };
      
    }
    return null;
  }
}

推荐答案

它不起作用的原因是,您对单个FormControl元素进行了验证,但您正在try 验证多个FormControl.您的验证器函数只接收confirmPassword个FormControl,而不接收表单中的其他控件.由于FormGroup中已经有FormControls,因此可以向FormGroup添加验证器函数.此函数应接受AbstractControl(将成为FormGroup),并可根据需要返回值.看起来您现有的验证器函数应该已经这样做了.

export class CustomerRegistrationComponent {
  form = new FormGroup({
    password: new FormControl('', Validators.required),
    confirmPassword: new FormControl('', Validators.required)
  }, {validator: PasswordValidators.validate});

...
}

Typescript相关问答推荐

TypScript如何在 struct 上定义基元类型?

对于使用另一个对象键和值类型的对象使用TS Generics

在Typescribe中,extends工作,但当指定派生给super时出错""

为什么TypeScript失go 了类型推断,默认为any?''

基于平台的重定向,Angular 为16

如何在TypeScrip中使用嵌套对象中的类型映射?

与字符串文字模板的结果类型匹配的打字脚本

无法正确推断嵌套泛型?

对扩展某种类型的属性子集进行操作的函数

TypeScrip:逐个 case Select 退出noUncheck kedIndexedAccess

使用打字Angular 中的通用数据创建状态管理

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

TypeScrip:来自先前参数的参数中的计算(computed)属性名称

如何以Angular 导入其他组件S配置文件

转换器不需要的类型交集

为什么我在这个重载函数中需要`as any`?

确保对象列表在编译时在类型脚本中具有唯一键

类型与泛型抽象类中的类型不可比较

数据库中的表请求返回如下日期:2023-07-20T21:39:00.000Z 我需要将此数据格式化为 dd/MM/yyyy HH:mm

我是否应该在 Next.js 中的服务器组件中获取秘密数据的所有函数中使用使用服务器?