4

我正在构建Ionic 2(typescript)应用程序。在复选框(ion-checkbox tag)中进行了简单的模型驱动表单验证后,发现问题仅限表单验证不适用于Ionic 2中的Angular 2 FormBuilder

我正在使用FormBuilder构建表单模块。我希望表单根据复选框输入控件的选中状态进行验证/未验证。但它的工作只有单向。这里是我的代码:

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

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-_][email protected][a-zA-Z]+\.[a-zA-Z]{2,4}$')])], 
      client_phone: ['', Validators.compose([Validators.required, Validators.pattern('^[\+0-9]{10,12}$')])], 
      terms: [null, Validators.required]  
     }); 
    } 
} 

实际视图:

regview

检查/取消条款&条件复选框不会更新验证逻辑,并且'NEXT'按钮的禁用状态不会更新。它的表单验证没有考虑这个复选框。一些帮助表示赞赏。

回答

1

初始化您的terms控制与null似乎打破变化事件的发射。尝试添加此订阅:

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); 
}); 

切换条件复选框不会导致任何日志记录。这可能是一个错误。

现在将您的控件初始化为false并重试:terms: [false, Validators.required]这次记录发生,您可以看到发生了什么。

不幸的是,现在控件一载入就处于有效状态。在构建FormGroup之后,可以使用类似的日志记录来检查它。最好的解决方案是创建一个真正的自定义验证器,但一个快速和肮脏的解决方案将是改变你的按钮:

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