Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 输入类型=数字验证在角度模式下工作不正常_Angular_Angular Reactive Forms_Angular Directive_Angular Forms - Fatal编程技术网

Angular 输入类型=数字验证在角度模式下工作不正常

Angular 输入类型=数字验证在角度模式下工作不正常,angular,angular-reactive-forms,angular-directive,angular-forms,Angular,Angular Reactive Forms,Angular Directive,Angular Forms,我希望input type=number接受介于0.1和0.9之间的十进制数(在点之后只允许有一个十进制数,例如:0.11是不允许的),还可以接受数字1。 我正试图从指令中限制它。该指令似乎有效,但我按下了提交按钮,表单控件的值不正确。 例如,如果我键入0.11,则输入中将显示0.1,但表单控件的值为0.11。 如果键入1到9之间的数字,则输入为空,但表单控件具有该数字的值。 这里有一个stackblitz链接:发生这种情况是因为您正在更新DOM,而不是表单模型。最简单和常见的方法之一是从指令发

我希望input type=number接受介于0.1和0.9之间的十进制数(在点之后只允许有一个十进制数,例如:0.11是不允许的),还可以接受数字1。
我正试图从指令中限制它。该指令似乎有效,但我按下了提交按钮,表单控件的值不正确。
例如,如果我键入0.11,则输入中将显示0.1,但表单控件的值为0.11。
如果键入1到9之间的数字,则输入为空,但表单控件具有该数字的值。

这里有一个stackblitz链接:

发生这种情况是因为您正在更新DOM,而不是表单模型。最简单和常见的方法之一是从指令发出事件,并在事件处理程序中更新表单模型,如下所示

**修改指令

import { Component, Output, EventEmitter } from "@angular/core";
//other import statements

@Directive({
  selector: "[appLimitDecimal]"
})
export class LimitDecimalDirective {
  @Output()
  purgedValue: EventEmitter<any> = new EventEmitter();
  @HostListener("input", ["$event"])
  changes(evt: any) {
    const removeLastChar = evt.target.value.substring(
      0,
      evt.target.value.length - 1
    );
    // if decimal number length is bigger than 3
    if (evt.target.value.length > 3) {
      console.log("fromDirective", removeLastChar);
    }
    // decimal numbers from 0.1 to 0.9 and 1
    // remove last character if does not match regex
    if (!/^(?:0(?:\.[1-9])?|1)$/.test(evt.target.value)) {
      // evt.target.value = removeLastChar;
      this.purgedValue.emit(removeLastChar);
    }
  }
}
我希望这对你有帮助

<input
  type="number"
  formControlName="numberInp"
   appLimitDecimal
  (purgedValue)="setValue($event)"
  min="0.1"
  max="1.0"
  step="0.1"
 />
  setValue(val) {
    this.f.patchValue({ numberInp: val });
  }