简体   繁体   English

表单验证不适用于Ionic 2中的Angular 2 FormBuilder

[英]Form validation is not working with Angular 2 FormBuilder in Ionic 2

I am building a Ionic 2 (typescript) application. 我正在构建一个Ionic 2(打字稿)应用程序。 Having problem ONLY in a simple model-driven form validation in checkbox ( ion-checkbox tag). 在复选框( ion-checkbox标签)中的简单模型驱动表单验证中出现问题。

I'm using FormBuilder to build the form module. 我正在使用FormBuilder来构建表单模块。 I want the form to be validated / not validated based on the checked state of a checkbox input control. 我希望根据复选框输入控件的选中状态验证/不验证表单。 But its working one-way only. 但它的单向工作。 Here's my code : 这是我的代码:

reg.html reg.html

<ion-content padding>
    <form class="client_profile" [formGroup]="regForm">
        <div class="profile_pic" id="profile_pix">
            <img src="build/images/home.svg" id="client_camera_pic" />
        </div>
        <ion-item>
            <ion-label floating>What we would call you?</ion-label>
            <ion-input type="text" formControlName="client_name"></ion-input>
        </ion-item>
        <ion-item>
            <ion-label floating>Choose your username</ion-label>
            <ion-input type="text" name="client_username" value="" #client_username formControlName="client_username"></ion-input>
        </ion-item>
        <ion-item>
            <ion-label floating>Where we will drop your Email?</ion-label>
            <ion-input type="email" name="client_email" value="" #client_email formControlName="client_email"></ion-input>
        </ion-item>
        <ion-item>
            <ion-label floating>We also need your phone number</ion-label>
            <ion-input type="number" name="client_phone" value="" #client_phone formControlName="client_phone"></ion-input>
        </ion-item>
        <ion-item class="reg_terms">
            <ion-checkbox secondary #terms name="terms" value="" checked="false" formControlName="terms"></ion-checkbox>
            <ion-label>I accept the <a href="#">Terms & Conditions</a></ion-label>
        </ion-item>
    </form>
    <div>
        <ion-buttons right class="client_reg_done">
            <button danger class="reg_complete" (click)="process_client_reg()" [disabled]="!regForm.valid">NEXT</button>
        </ion-buttons>
    </div>
</ion-content>

reg.ts reg.ts

import { Component, ViewChild, ElementRef } from '@angular/core';
import { FORM_PROVIDERS, FormBuilder, FormControl, FormGroup, AbstractControl, Validators, REACTIVE_FORM_DIRECTIVES } from '@angular/forms';
import { App, NavController, ViewController, ModalController, LoadingController, LoadingOptions } from 'ionic-angular';

@Component({
    templateUrl: "build/pages/registration/reg.html"
})
export class Registration {
    ngAfterViewInit(){

    }

    regForm: FormGroup;

    constructor(public app: App, public nav: NavController, public viewCtrl: ViewController, public elem: ElementRef, public modalCtrl: ModalController, public loading: LoadingController, public fb: FormBuilder){

    }

    ngOnInit() {
        this.regForm = this.fb.group({
            client_name: ['', Validators.compose([Validators.required, Validators.maxLength(30), Validators.pattern('^[a-zA-Z\. ]+$')])],
            client_username: ['', Validators.compose([Validators.required, Validators.maxLength(20), Validators.pattern('[a-zA-Z0-9-_\.]+')])],
            client_email: ['', Validators.compose([Validators.required, Validators.pattern('^[a-zA-Z0-9-_]+@[a-zA-Z]+\.[a-zA-Z]{2,4}$')])],
            client_phone: ['', Validators.compose([Validators.required, Validators.pattern('^[\+0-9]{10,12}$')])],
            terms: [null, Validators.required]      
        });
    }
}

Actual view: 实际观点:

regview

Checking / unchecking the Terms & Condition checkbox doesn't updating the validation logic and the 'NEXT' button disabled state is not updating. 选中/取消选中条款和条件复选框不会更新验证逻辑,并且'NEXT'按钮禁用状态不会更新。 Its because form validation isn't taking account this checkbox. 这是因为表单验证不考虑此复选框。 Some help is appreciated. 一些帮助表示赞赏。

Initialising your terms control with null seems to break the emission of change events. null初始化你的terms控制似乎打破了变化事件的发射。 Try adding this subscription: 尝试添加此订阅:

this.regForm.valueChanges.subscribe(v => {
  console.log('Required validation failed: ' + this.form.controls['terms'].hasError('required'));
  console.log('Required validation touched: ' + this.form.controls['terms'].touched);
  console.log('Required validation status: ' + this.form.controls['terms'].status);
});

Toggling the terms checkbox doesn't result in any logging. 切换术语复选框不会导致任何记录。 This might be a bug. 这可能是一个错误。

Now change your control to be initialised as false and try again: terms: [false, Validators.required] This time the logging happens and you can see what's going on. 现在将您的控件更改为初始化为false并再次尝试: terms: [false, Validators.required]这次记录发生,您可以看到发生了什么。

Unfortunately, now the control is in the valid state as soon as it loads. 不幸的是,现在控件一加载就处于有效状态。 You can check that with similar logging after building your FormGroup. 构建FormGroup后,可以使用类似的日志记录检查。 The best solution would be to create an is-true custom validator, but a quick and dirty solution would be to change your button: 最好的解决方案是创建一个真正的自定义验证器,但快速而肮脏的解决方案是更改按钮:

[disabled]="!regForm.valid || !form.controls.terms.touched"

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM