【问题标题】:Angular conditional validation on template driven form模板驱动表单上的角度条件验证
【发布时间】:2018-02-13 22:58:04
【问题描述】:

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

模板:

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

【问题讨论】:

  • 我会说最简单的方法是使用响应式表单,因为能够在运行时添加/删除验证是它的好处之一。但是,除此之外,您可以添加两个输入框,每个输入框都有一个 ngIf,如果设置了另一个值,则仅显示具有所需属性的输入框。
  • 嗯,这听起来可能有效(带有 ngif 的两个框),但由于某种原因,我感觉不对。当然我可以使用响应式表单,但我只是在过去几天里试图围绕模板驱动的表单进行思考。我希望模板驱动的表单可以具有与响应式表单相同的功能,否则为什么有角的人甚至会费心为您提供不完整的解决方案?
  • 模板驱动是为了简单和容易......那种只需要直接验证的表单。反应形式适用于任何超越直接的东西。不...它们与功能不兼容。否则他们为什么会提供两种方法。哈哈。 :-)
  • 不,我不知道,不确定什么是复数,但我很难从视频中学习(如果是这样的话),而且在我的经验中,教程几乎总是缺少一些关键信息。如果我找不到有关该主题的 O'Reilly 书籍,那么我会假设从反复试验中学习。
  • @Dallas Caley [required] 只需要一个布尔值,因此如果您的 id 不能是(未定义、null、0、false 或空字符串),请提供 [required]="payment.orderNumberType"。如果只需要检查是否 undefined [required]="payment.orderNumberType === undefined".

标签: angular validation


【解决方案1】:

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

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

【讨论】:

  • 我已通过以下方式有条件地制作了所需的文本框,希望对某人有所帮助。从基于所选选项的下拉列表中。 onMLSChange(mlsId: string) { if (mlsId === 'MLS_Not_Listed') { this.hideAgentId = true; } 其他 { this.hideAgentId = false;在 OnInit 中,我做了 this.hideAgentId = false;我使用 [hidden]="!hideAgentId" 将 div 设为隐藏,并使用 [required]="hideAgentId" 将字段设为必需
猜你喜欢
  • 1970-01-01
  • 2021-01-03
  • 1970-01-01
  • 1970-01-01
  • 2017-02-09
  • 2018-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多