【问题标题】:Angular2 reactive form confirm equality of valuesAngular2反应形式确认值相等
【发布时间】:2017-04-29 13:35:25
【问题描述】:

我正在尝试创建一个 Angular2 Reactive 表单,我必须在其中确认用户输入的电子邮件地址。这是plunker的链接

import { Component, OnInit } from '@angular/core';
import { FormControl, FormGroup, Validators } from '@angular/forms';
import { User } from './signup.interface';

@Component({
selector: 'signup-form',
template: `
    <form novalidate (ngSubmit)="onSubmit(user)" [formGroup]="user">
    <label>
        <span>Full name</span>
        <input type="text" placeholder="Your full name" formControlName="name">
    </label>
    <div class="error" *ngIf="user.get('name').touched && user.get('name').hasError('required')">
        Name is required
    </div>
    <div class="error" *ngIf="user.get('name').touched && user.get('name').hasError('minlength')">
        Minimum of 2 characters
    </div>
    <div formGroupName="account">
        <label>
        <span>Email address</span>
        <input type="email" placeholder="Your email address" formControlName="email">
        </label>
        <div
        class="error"
        *ngIf="user.get('account').get('email').hasError('required') && user.get('account').get('email').touched">
        Email is required
        </div>
        <label>
        <span>Confirm address</span>
        <input type="email" placeholder="Confirm your email address" formControlName="confirm">
        </label>
        <div
        class="error"
        *ngIf="user.get('account').get('confirm').hasError('required') && user.get('account').get('confirm').touched">
        Confirming email is required
        </div>
    </div>
    <button type="submit" [disabled]="user.invalid">Sign up</button>
    </form>
`
})
export class SignupFormComponent implements OnInit {
  user: FormGroup;
  constructor() {}
  ngOnInit() {
    this.user = new FormGroup({
    name: new FormControl('', [Validators.required, Validators.minLength(2)]),
      account: new FormGroup({
        email: new FormControl('', Validators.required),
        confirm: new FormControl('', Validators.required)
      })
    });
  }
  onSubmit({ value, valid }: { value: User, valid: boolean }) {
    console.log(value, valid);
  }
}

我想在这 2 个电子邮件字段不匹配时显示错误。

如何使用 angular2 中的响应式表单为这种行为创建这样的验证?

我看过一篇使用模板驱动方法 here 执行此操作的帖子,但我无法弄清楚如何使用响应式表单方法来执行此操作。

【问题讨论】:

    标签: javascript angular typescript angular2-forms


    【解决方案1】:

    我已经使用响应式表单完成了密码匹配。您可以将其更改为电子邮件。只需更改电子邮件的验证器代替密码即可。两者都是字符串,其他所有内容都相同,并将密码匹配错误放入电子邮件中。它会起作用

    app.module.ts

    将这些添加到您的 app.module.ts 文件中以使用响应式表单

    import { NgModule } from '@angular/core';
        import { BrowserModule } from '@angular/platform-browser';
        import { FormsModule, ReactiveFormsModule } from '@angular/forms';
        import { AppComponent } from './app.component';
        @NgModule({
          imports: [
            BrowserModule,
            FormsModule,
            ReactiveFormsModule,
         ],
        declarations: [
        AppComponent
         ]
      providers: [],
      bootstrap: [
        AppComponent
       ]
      })
    export class AppModule {}
    

    app.component.ts

    import { Component,OnInit } from '@angular/core';
    import template from './add.component.html';
    import { FormGroup,FormBuilder,Validators } from '@angular/forms';
    import { matchingPasswords } from './validators';
    @Component({
        selector: 'app',
        template
    })
    export class AppComponent implements OnInit {
        addForm: FormGroup;
        constructor(private formBuilder: FormBuilder) {
        }
        ngOnInit() {
    
        this.addForm = this.formBuilder.group({
                username: ['', Validators.required],
                email: ['', Validators.required],
                role: ['', Validators.required],
                password: ['', Validators.required],
                password2: ['', Validators.required] }, 
              { validator: matchingPasswords('password', 'password2') <-- replace args with email_1 and email_2
            })
        };
    
    addUser() {
            if (this.addForm.valid) {
                var adduser = {
                    username: this.addForm.controls['username'].value,
                    email: this.addForm.controls['email'].value,
                    password: this.addForm.controls['password'].value,
                    profile: {
                        role: this.addForm.controls['role'].value,
                        name: this.addForm.controls['username'].value,
                        email: this.addForm.controls['email'].value
                    }
                };
              console.log(adduser);// adduser var contains all our form values. store it where you want 
                this.addForm.reset();// this will reset our form values to null 
            }
        }  
    }
    

    app.component.html

    <div>
      <form [formGroup]="addForm">
       <input type="text" placeholder="Enter username" formControlName="username" />
       <input type="text" placeholder="Enter Email Address" formControlName="email"/>
       <input type="password" placeholder="Enter Password" formControlName="password" />
       <input type="password" placeholder="Confirm Password" name="password2" formControlName="password2"/>
       <div class='error' *ngIf="addForm.controls.password2.touched">
        <div class="alert-danger errormessageadduser" *ngIf="addForm.hasError('mismatchedPasswords')">                                  Passwords do not match
      </div>
    </div>
    <select name="Role" formControlName="role">
        <option value="admin" >Admin</option>
        <option value="Accounts">Accounts</option>
        <option value="guest">Guest</option>
    </select>
    <br/>
    <br/>
    <button type="submit" (click)="addUser()"><span><i class="fa fa-user-plus" aria-hidden="true"></i></span> Add User </button>
    </form>
    </div>
    

    validators.ts

    export function matchingPasswords(passwordKey: string, confirmPasswordKey: string) {
        return (group: ControlGroup): {
            [key: string]: any
        } => {
            let password = group.controls[passwordKey];
            let confirmPassword = group.controls[confirmPasswordKey];
    
            if (password.value !== confirmPassword.value) {
                return {
                    mismatchedPasswords: true
                };
            }
        }
    }
    

    【讨论】:

    • 对此答案的补充:您还可以在参数中访问AbstractControlFormGroup 并使用它们直接访问表单控件,这样您就不必通过和确认Pass。 FormGroup 扩展自 AbstractControl 所以两者都有效。
    猜你喜欢
    • 2017-02-11
    • 2017-09-15
    • 2018-02-06
    • 2017-12-22
    • 2017-11-22
    • 1970-01-01
    • 2017-11-02
    • 2017-09-14
    • 2017-09-12
    相关资源
    最近更新 更多