模板驱动表单的 Angular 条件验证

标签 angular validation

我有一个只有在设置了另一个值时才需要的输入字段。另一个值来自一个选择。请注意,我的实际表格要复杂得多,但这里有一个示例显示与此问题相关的部分:

模板:

<form name="createPaymentForm" (ngSubmit)="f.form.valid && createPayment()" #f="ngForm" novalidate>

  <select name="orderNumberType" #orderNumberType="ngModel" 
    [(ngModel)]="payment.orderNumberType">
    <option [ngValue]="undefined" disabled>Select</option>
    <option *ngFor="let opt of paymentIdOptions" [value]="opt.id">{{opt.label}}</option>
  </select>

  <div [ngClass]="{ 'has-error': f.submitted && !orderNumber.valid }">
    <input type="text" name="orderNumber"
      [(ngModel)]="payment.orderNumber" #orderNumber="ngModel">
  </div>

</form>

组件:

import { Component, OnInit } from '@angular/core';
import { PaymentsService } from '../../../services/payments.service';
import { Payment } from '../../../models';

@Component({
  selector: 'app-new-payment',
  templateUrl: './new-payment.component.html',
  styleUrls: ['./new-payment.component.scss']
})
export class NewPaymentComponent implements OnInit {
  paymentIdOptions: any = [];
  payment: Payment = {};

  constructor( private paymentsService: PaymentsService ) { }

  ngOnInit() {
    this.paymentsService.getOrderNumberTypes().subscribe(orderNumberTypes => {
      this.paymentIdOptions = orderNumberTypes;
    });
  }

  createPayment() {
    console.log(this.payment);
    //do something...
  }
}

我的目标是仅在 orderNumberType 设置为“未定义”以外的任何值时才需要 orderNumber。实现这一点的最简单方法是什么?

(注意,Angular 5)

最佳答案

可以使用 必需的 Angular 指令 来完成,例如 [required]="payment.orderNumberType"(他检查 payment.orderNumberType 是否为 undefined、null、0、假或空字符串)。 这是 [attr.required]="payment.orderNumberType ? true : undefined" 的简写。

你对 [ngClass]="{ 'has-error': f.submitted && !orderNumber.valid }"有疑问,因为 valid 将在“ngAfterViewChecked”期间设置,所以 Angular 不想再次完成这项工作。 将其替换为 [class.has-error]="f.submitted && !orderNumber.valid" 不会再让它哭了。

关于模板驱动表单的 Angular 条件验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48777059/

相关文章:

angular - [Angular-CLI-6]无法确定 'Serve' 目标的单个项目

node.js - 使用 Api.ai Nodejs Angular socket.io 的聊天机器人

angular - 从一个 View 到另一个 View 访问模板引用变量

javascript - 如何在 Ember JS 中从父 Controller 获取子 Controller 的引用?

JavaFX:如果 TextField 的条件在 ActionEvent 上无法正常工作?

angular - 从深度嵌套的目录结构中导入模块

javascript - Mat-select by formarray 不显示所选值和选项 - 响应式(Reactive)表单 Angular

java - Spring 中使用@Valid 的验证表单不起作用

sql-server-2005 - SQL左联接(多个联接条件)

java - hibernate validator : Must I use Maven?