模板驱动表单上的角度条件验证

Dal*_*ley 5 validation angular

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

模板:

<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>
Run Code Online (Sandbox Code Playgroud)

组件:

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...
  }
}
Run Code Online (Sandbox Code Playgroud)

我的目标是只在orderNumberType设置为'undefined'以外的任何值时才需要orderNumber.实现这个的最简单方法是什么?

(注意,Angular 5)

Gil*_*dav 9

这是可以做到用所需的角度指令一样[required]="payment.orderNumberType"(他在这里检查,如果payment.orderNumberType未定义,为null,0,虚假或空字符串).这是一个简写[attr.required]="payment.orderNumberType ? true : undefined".

你有[ngClass] ="{'has-error':f.submitted &&!orderNumber.valid}"的问题,因为在"ngAfterViewChecked"期间会设置有效,因此Angular不想再次创建作业.取代它[class.has-error]="f.submitted && !orderNumber.valid"不会再让它哭了.