【问题标题】:Angular 6 validate number inputAngular 6验证数字输入
【发布时间】:2018-10-24 08:47:05
【问题描述】:

我有一个输入,类型是数字。我想设置最小值和最大值,如果输入超出这个范围(最大值),就会显示错误。

我的问题是,如果输入不为空但无效,则错误消失(例如:min =10,max =20,input =2000,仍然没有错误显示)。

我在这个网站上搜索,有一篇关于验证的帖子,但解决方案是使用 。我不想使用

参考:here

有没有办法解决我的问题?

我的 add-hero.component.html:

<div class="publishedYear">
<label>Publish Year: </label>
<input type="number" id="PublishedYear" name="PublishedYear" required min="10" max="20" 
[(ngModel)]="hero.PublishedYear" #publishedYear="ngModel">
<p class="alert alert-danger invalid" *ngIf="publishedYear.errors">Invalid Published Year</p>
</div>

我的英雄.ts

export class Hero {
Id: number;
Name: string;
PublishedYear: number;
Complete?: boolean;
}

【问题讨论】:

  • 这可能与模板没有太大关系,而且与您的构造函数和组件结构有关,您可以显示更多代码吗?
  • @Synoon 在我的构造函数中什么都没有,我将我的 Hero.ts 添加到问题中。
  • 当用户完成输入值和更新要在 *ngIf 条件中使用的变量。
  • @SasiKumarM 你能发布一个关于在 html 中使用 ng-form 的答案吗?我不使用任何 ng-form,只是简单的
    。提前谢谢你。

标签: angular angular6


【解决方案1】:

当您使用输入 type="number" 设置 min 和 max 时,您的解决方案只会在用户使用滚动条递增或递减数字时停止允许用户。但是当用户直接在文本中输入数字时,它不会显示任何错误

有两种解决方案

1) 使用角度表单验证将表单控件添加到您的输入中,在线会有几个示例

2) 在更改文本框或单击按钮时调用函数以验证用户输入的数字是否与您在 ts 文件中的表达式匹配。

使用你需要做的表单验证

myForm = new FormGroup({}) // Instantiating our form

constructor(private fb: FormBuilder){ // Injecting the ReactiveForms FormBuilder.
  this.myForm = fb.group({
    // Adding the "myNum" input to our FormGroup along with its min-max Validators.
    'myNum': ['', [Validators.min(5), Validators.max(10)]] 
  })
}

在 HTML 中

<form [formGroup]="myForm"> <!-- Binding myForm to the form in the template -->
    <label for="myNum">Some Val</label>
    <!-- formControlName binds our myNum field declared in the ts code. -->
    <input type='number' id="myNum" formControlName="myNum">
    <div *ngIf="myForm.controls['myNum'].hasError('max')">
          Minimum required number is 15.
    </div> 
</form>

【讨论】:

  • 让我试试这个,我很快就会告诉你结果。提前谢谢你。
  • " 行中的 num1 是什么?
  • 它是一个错误消息检查,当条件不满足时它会显示错误
  • 我收到一个错误:“错误类型错误:无法读取未定义的属性‘错误’”。所以“num1”是未定义的,那么它不能得到未定义对象的“错误”。
  • 谢谢,我终于解决了这个问题。感谢您的努力,我们非常感谢您的解决方案。
【解决方案2】:

See the sample code in stackblitz

import { Component } from '@angular/core';

import { Directive, Input, forwardRef } from "@angular/core";
import {
    Validator, AbstractControl, NG_VALIDATORS, Validators, ValidatorFn
    } from "@angular/forms";

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent  {
  hero: any = {};
}


@Directive({
    selector: "[min][formControlName],[min][formControl],[min][ngModel]",
    providers: [
        { provide: NG_VALIDATORS,
            useExisting: forwardRef(() => MinDirective),
            multi: true }
    ]
})
export class MinDirective implements Validator {
    private _validator: ValidatorFn;
    @Input() public set min(value: string) {
        this._validator = Validators.min(parseInt(value, 10));
    }

    public validate(control: AbstractControl): { [key: string]: any } {
        return this._validator(control);
    }
}

@Directive({
    selector: "[max][formControlName],[max][formControl],[max][ngModel]",
    providers: [
        { provide: NG_VALIDATORS,
            useExisting: forwardRef(() => MaxDirective),
            multi: true }
    ]
})
export class MaxDirective implements Validator {
    private _validator: ValidatorFn;
    @Input() public set max(value: string) {
        this._validator = Validators.max(parseInt(value, 10));
    }

    public validate(control: AbstractControl): { [key: string]: any } {
        return this._validator(control);
    }
}

<input type="number" [(ngModel)]="hero.count" name="count" #count="ngModel" required min="1" max="100">

<p *ngIf="count.invalid">Invalid Published Year</p>

将这两个指令添加到声明中。这应该适用于模板驱动的表单

【讨论】:

  • 您的解决方案有效,但我找到了另一种解决问题的方法。顺便说一句,非常感谢您的解决方案,感谢您的努力。
  • 选择器应该更严格,否则会与mat-datepicker 冲突,minmax 有自己的验证器。例如 input[type='number'][max][formControlName],... 应用于数字输入。
【解决方案3】:

感谢您在上面的所有回答和您的努力。 经过几个小时的研究,我终于得到了答案:page

如果你有和我一样的问题,这里就是答案。

我的 .html 文件:

<form [formGroup]="myForm">
<label for="publishedYear">Publish Year: </label>
<input type="number" id="PublishedYear" formControlName="publishedYear">
<div *ngIf="f.publishedYear.errors">
  Invalid Published Year
</div>

我的 .ts 文件:

import { Component, OnInit, Input } from '@angular/core';
import { Hero } from '../Hero';
import { HeroService } from '../hero.service';
import { Router } from '@angular/router';
import { FormBuilder, FormGroup, Validators, ReactiveFormsModule } from 
'@angular/forms';

@Component({
selector: 'app-hero-add',
templateUrl: './hero-add.component.html',
styleUrls: ['./hero-add.component.css']
})
export class HeroAddComponent implements OnInit {

hero: Hero = new Hero();

myForm = new FormGroup({}) // Instantiating our form

get f() { return this.myForm.controls; }

constructor(private heroService: HeroService, private router: Router, private 
formBuilder: FormBuilder) {
    this.myForm = formBuilder.group({     
    publishedYear: ['', [Validators.min(1990), Validators.max(2018)]]
});
}

  ngOnInit() {
  }     
}

【讨论】:

  • 当用户输入像 2019 这样的值时,您如何处理这些错误?
  • @CodeChanger 显示包含“Invalid Published Year”的 div。
  • 在我的项目中实现了这个解决方案,效果很好!谢谢!
【解决方案4】:

在模板驱动表单中处理最小最大验证的最简单方法是使用 html 的模式属性并为其分配一个正则表达式编号,例如范围为 0-24 的输入将是

<input pattern="([0-9]|1[0-9]|2[0-4])" required type="number" id="monday" name="monday" [(ngModel)]="pullingStrategy.one" #monday="ngModel" />

因此,如果值不在范围内,则表单将无效 如果您想为任何其他范围生成正则表达式编号,请使用此 链接https://3widgets.com/

【讨论】:

    【解决方案5】:

    在html和ts文件中使用代码

    <input type="text" class="form-control" (input)="onSearchChange($event.target.value)">
    
    onSearchChange(searchValue: string): void {  
      console.log(searchValue);
    // validate the value here
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 2019-04-11
      相关资源
      最近更新 更多