【问题标题】:Reactive Form validation not working反应式表单验证不起作用
【发布时间】:2018-02-09 08:40:28
【问题描述】:

我已经为用户注册创建了一个组件

import { Component } from '@angular/core';
import {UserManagementService} from '../user-management.service';
import {User} from "../user";
import {FormBuilder, FormGroup,Validators} from "@angular/forms";

@Component({
  selector: 'app-signup-component',
  templateUrl: './signup-component.component.html',
  styleUrls: ['./signup-component.component.css'],
  providers:[UserManagementService]
})
export class SignupComponentComponent  {

  newUser:User;

  signupForm:FormGroup; 

  constructor(private userManagementService: UserManagementService, private fb:FormBuilder) {
    this.createForm();
  }

  createForm(){
    this.signupForm = this.fb.group({
      firstName:['',Validators.required], 
      lastName:['',Validators.required],
      email:['',Validators.required],
      password:['',Validators.required]
    });
  }

  addUser(){
    this.newUser = new User({
      firstname:this.signupForm.get('firstName').value,
      lastname:this.signupForm.get('lastName').value,
      email:this.signupForm.get('email').value
    });
    console.log("in SignupComponentComponent: addUser: "+this.newUser);
    this.userManagementService.addUser(this.newUser);
  }

}

下面是模板

<div class="div__signup"> 
  <div class="content_div--white"> 

    <form class="signup-form" [formGroup]="signupForm" (ngSubmit)="addUser()" novalidate>
      <label for="firstname" class="first-name">First Name</label>

      <input id="firstname" type="text" class="form-control" formControlName="firstName" required>

      <label for="lastname" class="last-name">Last Name</label>
      <input id="lastname" type="text" class="form-control" formControlName="lastName" required>

      <label for="email" class="email"> Email</label>
      <input id="email" type="email" class="form-control" formControlName="email" required>

      <label for="password" class="password">Password</label>
      <input id="password" type="password" class="form-control" formControlName="password" required>

      <label for="verify-password" class="verify-password">Verify Password</label>
      <input id="verify-password" type="password" class="form-control" required>

      <button type="submit"  id="signup-button" class="content-div__button--blue"> Sign Up! </button>
    </form>
  </div>
</div>

UserManagementService 是

import { Injectable } from '@angular/core';
import {User} from './user';

@Injectable()
export class UserManagementService {

  constructor() { }

  addUser(user:User){
    console.log("In UserManagementService: addUser: "+user)
  }

}

即使我提交带有任何数据的表单(所有input 为空),我也会看到以下两条控制台消息

in SignupComponentComponent: addUser: [object Object]
In UserManagementService: addUser: [object Object]

似乎Validators 不起作用(我一定没有正确使用它们)。为什么会调用 UserManagementService。如果表单有错误,Angular不应该不提交表单吗?

【问题讨论】:

    标签: javascript html angular typescript


    【解决方案1】:

    给你:

      addUser(){
        if (this.signupForm.valid) {
          this.newUser =  this.signupForm.value;
          console.log("in SignupComponentComponent: addUser: ", this.newUser);
          this.userManagementService.addUser(this.newUser);
        }
      }
    
      <button type="submit" [disabled]="signupForm.invalid" id="signup-button" class="content-div__button--blue"> Sign Up! </button>
    

    您首先需要测试表单是否有效。即使表单无效,Angular 也允许您提交表单,以便您可以制作自己的东西(例如,显示错误消息)。

    您还可以通过直接获取表单的值来缩短代码,而不是像您那样重新创建用户。

    如果您的表单无效,您也可以停用您的按钮,以便用户无法发送表单。

    【讨论】:

    • 顺便说一下,当您想在控制台中显示对象时,请使用逗号而不是加号。这将使您的对象可展开,以便您可以查看其属性,而不是显示[Object object]
    • 感谢您的提示。我以前从未使用过那个逗号。你能举个例子吗?
    • 逗号的一个例子?只需使用我的一段代码,我就用它制作了一个控制台日志:)
    • 啊!没注意到。谢谢
    猜你喜欢
    • 2019-11-15
    • 2019-01-26
    • 2022-01-09
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    • 2018-09-18
    • 2019-03-23
    • 1970-01-01
    相关资源
    最近更新 更多