简体   繁体   English

Angular 2中的表单输入验证(模板驱动)

[英]Form input validation in Angular 2(template driven)

I would like to make these inputs to display a message such as "Name is required" when submitted(so the submit button is disabled until there is name inside). 我想让这些输入在提交时显示诸如“名称是必需的”之类的消息(因此在内部有名称之前禁用提交按钮)。 Is there perhaps a simple way to do it with Angular 2 Template Driven forms? 使用Angular 2模板驱动表单可能有一种简单的方法吗? I guess that I should provide some properties in form's HTML, and connect it to a component, but could not figure it out while following the samples in documentation. 我想我应该在表单的HTML中提供一些属性,并将它连接到一个组件,但是在跟踪文档中的示例时无法弄明白。 Appreciate all the help. 感谢所有的帮助。

<form class="">
    <div>
        <p>Name:</p>
        <input type="text">
    </div>
    <div class="link-input">
        <p>City:</p>
        <input type="text">
    </div>

    <button 
        (click)="submitForm()">
        Submit
    </button>
</form>

Your Html : 你的Html:

<form role="form" [formGroup]="inputForm" novalidate>
    <div>
        <p>Name:</p>
        <input
         formControlName="name"
         type="text">
    </div>
    <div class="link-input">
        <p>City:</p>
        <input
         formControlName="city"
         type="text">
    </div>

    <button 
        [disabled]="!inputForm.valid"
        (click)="submitForm()">
    </button>
</form>

Your Component: 你的组件:

import { FormGroup, FormBuilder, FormControl, Validators } from '@angular/forms';

export class InputComponent  {   
   public inputForm: FormGroup;
  constructor(private formBuilder: FormBuilder) {

  this.inputForm = this.formBuilder.group({
  name:    new FormControl('', Validators.required),
  city:    new FormControl('', Validators.required),
   });
  }
//... codes..
}

TEMPLATE DRIVEN FORMS 模板驱动形式

I also having this question and i found answer and that i wanted to share with you. 我也有这个问题,我找到了答案,我想和你分享。 I created a login form with validation which is look like as following: 我创建了一个带有验证的登录表单,如下所示:

login.component.html login.component.html

<div class="col-md-6 col-md-offset-3">
    <h2>Login</h2>
    <form name="form" (ngSubmit)="f.form.valid && login()" #f="ngForm" novalidate>
        <div class="form-group" [ngClass]="{ 'has-error': f.submitted && !username.valid }">
            <label for="username">Username</label>
            <input type="text" class="form-control" name="username" [(ngModel)]="model.username" #username="ngModel" required />
            <div *ngIf="f.submitted && !username.valid" class="help-block">Username is required</div>
        </div>
        <div class="form-group" [ngClass]="{ 'has-error': f.submitted && !password.valid }">
            <label for="password">Password</label>
            <input type="password" class="form-control" name="password" [(ngModel)]="model.password" #password="ngModel" required />
            <div *ngIf="f.submitted && !password.valid" class="help-block">Password is required</div>
        </div>
        <div class="form-group">
            <button [disabled]="loading" class="btn btn-primary">Login</button>
            <img *ngIf="loading" src="loading.gif" />
            <a [routerLink]="['/register']" class="btn btn-link">Register</a>
        </div>
    </form>
</div>

login.component.ts login.component.ts

import { Component, OnInit } from '@angular/core';
import { Router, ActivatedRoute } from '@angular/router';

import { AlertService, AuthenticationService } from '../services';

@Component({
    templateUrl: './login.component.html'
})

export class LoginComponent implements OnInit {
    model: any = {};
    loading = false;
    returnUrl: string;

    constructor(
        private route: ActivatedRoute,
        private router: Router,
        private authenticationService: AuthenticationService,
        private alertService: AlertService) { }

    ngOnInit() {}

    login() {
        this.loading = true;
        this.authenticationService.login(this.model.username, this.model.password)
            .subscribe(
                data => {
                    this.router.navigate([this.returnUrl]);
                },
                error => {
                    this.alertService.error(error);
                    this.loading = false;
                });
    }
}

I hope this will help you if you need any help you can write me. 如果您需要任何帮助,我希望这对您有所帮助。 I feel happy to help you. 我很乐意帮助你。 @Smithy i am also learning angular 2. @Smithy我也在学习角度2。

This makes sure that that the form has been touched (inputs have been changed) and that the name field is at least 1 letter long. 这样可以确保表单已被触摸(输入已更改),并且名称字段长度至少为1个字母。 You can do something similar for city. 你可以为城市做类似的事情。

Component: 零件:

import { FormGroup, FormBuilder, FormControl, Validators } from '@angular/forms';

export class InputComponent  {   
  public inputForm: FormGroup;
  constructor(private formBuilder: FormBuilder) {

    this.inputForm = this.formBuilder.group({
      name:    new FormControl('', Validators.required, Validators.minLength(1)]),
      city:    new FormControl('', Validators.required),
    });
  }
}

View: 视图:

<form [formGroup]="inputForm" novalidate>
  <p>Name:</p>
  <input placeholder="Exercise" formControlName="name">
  <div class="errorMsg" *ngIf="inputForm.get('name').touched && inputForm.get('name').status === 'INVALID'">
    Name is required</div>
  <p>City:</p>
  <input placeholder="Exercise" formControlName="city">
  <button [disabled]="!inputForm.valid || !inputForm.touched (click)="submitForm()">Submit</button>
</form>

The angular 2 form validation quite differs than what we have done in angular 1. when you write form tag to the DOM angular 2 adds the ngForm and ngControl to it. 角度2形式验证与我们在角度1中所做的完全不同。当您将表格标签写入DOM角度2时,将ngForm和ngControl添加到其中。 A button can be disabled by using angular2 property [disabled]. 可以使用angular2属性[禁用]禁用按钮。 to keep button disabled you need to apply validation property to [disabled]. 要保持按钮禁用,您需要将验证属性应用于[已禁用]。 I have given one simple example which will give you form validation, input fields validation with pattern validation. 我给出了一个简单的例子,它将为您提供表单验证,输入字段验证和模式验证。 the button will be disabled until the form will be valid 该表单有效后,该按钮将被禁用

In your HTML 在您的HTML中

<form [formGroup]="myForm" (ngSubmit)="submitForm(myForm.value)">
  <div class="form-group" [ngClass]="{'has-error':!signinForm.controls['usermail'].valid && signinForm.controls['usermail'].touched}">
      <label>Email Address</label>
      <input class="form-control" type="email" [formControl]="signinForm.controls['usermail']">
      <span *ngIf="signinForm.controls['usermail'].hasError('required') && signinForm.controls['usermail'].touched && !signinForm.submitted" class="required pull-right">*Please Enter Email</span>
      <span *ngIf="signinForm.controls['usermail'].hasError('pattern') && signinForm.controls['usermail'].touched" class="required pull-right">*Invalid Email</span>
    </div>
    <div class="form-group" [ngClass]="{'has-error':!signinForm.controls['userpass'].valid && signinForm.controls['userpass'].touched}">
       <label>Password</label>
       <input class="form-control" type="password" [formControl]="signinForm.controls['userpass']" (focus)="showErrorMessage=false">
        <span *ngIf="signinForm.controls['userpass'].hasError('required') && signinForm.controls['userpass'].touched && !signinForm.submitted" class="required pull-right">*Please Enter Password</span>
    </div>
      <button type="submit" class="btn btn-pri mds_btn" [disabled]="!signinForm.valid">Login</button>       
</form>

In your Component 在您的组件中

import { Component } from '@angular/core';
import { FormGroup, FormBuilder, Validators } from '@angular/forms';
import { Router } from '@angular/router';

@Component({
  selector: 'app-login',
  templateUrl: './login.component.html',
  styleUrls: [ './login.component.scss' ]
})
export class LoginComponent {
   myForm: FormGroup;

   emailRegex: any = '^[a-z0-9]+(\.[_a-z0-9]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,15})$';
    passRegex:any ='^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,}$'; 

   constructor(fb: FormBuilder) {

      this.myForm = fb.group({
         'logmail': [ null, Validators.compose([ Validators.required, Validators.pattern(this.emailRegex) ]) ],
         'logpass': [ null, Validators.compose([ Validators.required, Validators.pattern(this.passRegex) ]) ]
      });

    this.myForm.valueChanges.subscribe((form: any) => {
   });
  }

  submitForm(lgvalue: any) {
       //do logic here after submitting the form

  }
}

in this example, I am using FormGroup directive of FormBuilder.The FormBuilder creates instances of FormGroup, which we refer to as a form. 在这个例子中,我使用FormBuilder的FormGroup指令.FormBuilder创建FormGroup的实例,我们将其称为表单。 I am also subscribing to the form so that whenever the value entered in the input field the form will be subscribed. 我也订阅了表单,这样无论何时在输入字段中输入的值,表格都将被订阅。

I hope this will help you :) 我希望这能帮到您 :)

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

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