【问题标题】:Form Validation using a boolean flag Angular 8使用布尔标志Angular 8进行表单验证
【发布时间】:2020-11-03 19:00:50
【问题描述】:

在 HTML 中,我有一个 (change)="limitUser($event)" 函数。在打字稿中,我有一个 for 循环,它遍历每个元素并检查值是否小于 10。如果超过 10,则设置 inValid = true。 在 HTML 中,我所有的表单字段都将值设置为 true。我只希望将值大于 10 的表单字段设置为 true。

HTML 代码:

<div *ngFor="p of data; let i = index">
<label>p.name{{i}}</label>
<input type="text" class="form-control" (change)="limitUser($event)" name="p.name{{i}}" [(ngModel)]="p.usage" id="p.name">
<div class="danger" *ngIf="inValid">
Please enter number smaller than 10
</div>
</div>

在打字稿中:

limitUser(event){
for (let i = 0; i < this.data.length; i ++) {
if (this.data[i].usage = 0 || this.data[i].usage = null || this.data[i].usage = ""){
this.data[i].usage = 0;
}
if (this.data[i].usage > 10){
this.inValid = true;
}

inValid = true 应用于所有动态表单字段。怎样才能把它只放在值大于10的字段上。

【问题讨论】:

  • 您的 HTML 无效,请调整。
  • 我已经关闭了
    标签。但除此之外,它是一个有效的 HTML 代码,因为它运行良好。它只是没有正确应用验证
  • input 的三个属性缺少右引号。
  • 是的,我关闭了那些。谢谢你的意见。我只是输入代码没有复制它。但是你现在能弄清楚这个问题吗?
  • 问题是你只有一个全局标志。您的每个数据项都需要一个“无效”标志。
  • 标签: html angular typescript validation angular8


    【解决方案1】:

    嗯,inValid 是一个布尔变量,您希望它对每个适用字段都有效。

    要么为每个字段设置一个单独的变量,要么创建一个方法来检查每个字段的有效性。让我们采用第二种方法:

    因此,您的 HTML 代码应如下所示(更新 *ngIf 指令):

    <div *ngFor="p of data; let i = index">
     <label>p.name{{i}}</label>
     <input type="text" class="form-control" name="p.name{{i}}" (change)="limitUser($event)" [(ngModel)]="p.usage" id="p.name">
     <div class="danger" *ngIf="isInvalid(i)">
      Please enter number smaller than 10
     </div>
    </div>
    

    并在你的 TS 中添加一个新方法,以及修改limitUser()

    isInvalid(index) {
     return this.data[index].usage > 10;
    }
    
    limitUser(event) {
     for (let i = 0; i < this.data.length; i ++) {
      // btw, use === to compare; == means loosely compare and = means assign
      // or just append ! to check for falsy values, like:
      if (!this.data[i].usage){
       this.data[i].usage = 0;
      }
     }
    }
    

    您可以重复使用您的 inValid 变量来检查表单的整体有效性,或者直接删除它。

    更新:

    当一切都被禁用时禁用提交按钮:

    修改您的提交按钮以在 HTML 中包含 [disabled] 属性:

    ...
    <button type="submit" [disabled]="isFormInvalid">
    ...
    

    在 TS 中:

    get isFormInvalid() {
     return this.data.some(datum => datum.usage > 10);
    }
    

    【讨论】:

    • 你建议我也应该在isInvalid(index) {} 函数中使用for循环吗?否则它会立即抛出错误,不是吗?
    • @Bitly 不需要forLoop,Angular 会自动运行更改检测(除非另有说明)。因此,isInvalid 函数将在每次检测到更改时自动运行。尝试使用我的答案中的功能。如果它适合你,请告诉我:)
    • 我不知道为什么,但我收到了return this.data[i].usage &lt; 10的错误
    • 哦,我搞错了,用index代替i。我已经更新了答案。再试一次@Bitly,很抱歉
    • 它做到了@Tashi Starset
    猜你喜欢
    • 2019-02-08
    • 1970-01-01
    • 2023-04-03
    • 2014-11-26
    • 1970-01-01
    • 2017-08-07
    • 1970-01-01
    • 2016-05-05
    • 1970-01-01
    相关资源
    最近更新 更多