Angular 2 防止enter在模板驱动的表单中提交

Angular 2 prevent enter from submitting in template-driven form

我有使用模板驱动蓝图的表单,所以像这样:

<form #myForm="ngForm" ngSubmit="save(myForm.value, myForm.isValid)">
  <input #name="ngModel" [(ngModel)]="name">
  <button type="submit">Submit form</button>
</form>

现在,如何阻止 ENTER 提交表单?它会干扰表单内部的自定义 ENTER 行为,如果您不小心在输入中按了 enter,这是不需要的。

我环顾四周,找到了一些旧的 Angular 1 答案和一些标准的 JavaScript 答案,但我觉得 Angular 2 必须已经内置了类似的东西但是我还没找到。

如果他们不这样做,实现这一目标的最佳方法是什么?

原来你可以使用像这样简单的东西:

<form (keydown.enter)="$event.preventDefault()"></form>

防止表单在 ENTER 时提交。

让回车键在textareas有效,但不提交表单,可以修改如下:

在 HTML 模板中:

<form (keydown.enter)="handleEnterKeyPress($event)">...</form>

在组件的class后面的.ts代码中:

handleEnterKeyPress(event) {
    const tagName = event.target.tagName.toLowerCase();
    if (tagName !== 'textarea') {
      return false;
    }
  }

我知道我迟到了,但也许我有合适的解决方案,

如果您正在使用 <button> 则只需定义

<button type="button">

而不是定义它或将其定义为 type="submit" 因为如果你不定义它,它会提交你的表单。

同样,如果你使用 <input> 然后也定义

<input type="button"> 

这会起作用。

-- 编辑为@Chrillewoodz 评论。

如果你想在submit/click上做一些特定的处理,你可以给按钮添加点击事件,这样你就可以做任何你想做的事情。

如果你想要angular ts文件中的Form标签,那么你可以使用@ViewChild.

有同样的问题,这对我有帮助:

<button type="submit" [disabled]="!myForm.valid">Save</button>

Angular: 8.2.11

<div class="div101">
  <div class="card col-md-10">
    <form [formGroup]="postForm" (keydown.enter)="$event.preventDefault()" (ngSubmit)="onSubmit()">
      <br />
      <div class="form-group">
        <label class="col-md-3">Name</label>
        <input class="col-md-12 form-control" type="text" formControlName="Name" required>
      </div>

      <div class="form-group">
        <label class="col-md-4">Date of Birth</label>
        <input type="text" placeholder="Date of Birth" class=" col-md-12 form-control" formControlName="DateofBirth"
          required bsDatepicker>
      </div>

      <div class="form-group">
        <label class="col-md-3">Mobile No</label>
        <input class="col-md-12 form-control" type="text" formControlName="MobileNo" required>
      </div>


      <div class="form-group">
        <label for="SelectCountry" class="col-md-3">Country</label>
        <select class="col-md-12 form-control" formControlName="Country" (change)="onChangeCountry($event)">
          <option *ngFor="let country of country; let i = index" value="{{i}}">{{country.name}}</option>
        </select>
      </div>


      <div class="form-group">
        <button type="submit" (click)="Save()" [disabled]="!postForm.valid" class="btn btn-success">Submit</button>
      </div>
    </form>
  </div>
</div>

使用:

<form (keydown.enter)="$event.preventDefault()" (keydown.shift.enter)="$event.preventDefault()"></form>

它会阻止标签和标签中的内容提交 entershift + enter.

例如:它对我有用:

<div name = "example" (keydown.shift.enter)="$event.preventDefault()" (keydown.enter)="$event.preventDefault()" ...

在此之后,此示例 div 下的所有内容都无法提交 entershift + enter.

有关组合键的更多信息: https://alligator.io/angular/binding-keyup-keydown-events/#key-combinations

这对我有帮助:

  • 必须作为提交按钮的按钮应该是type="button"
  • 那个按钮应该有 (click)="onSubmit()" <- 将被调用的方法
  • 你可以从中删除 (ngSubmit)="onSubmit()" <form [formGroup]="form" (ngSubmit)="onSubmit()">

我不确定从表单中删除 (ngSubmit) 是否有副作用。 顺便说一句:我观察到

<form (keydown.enter)="$event.preventDefault()" (keydown.shift.enter)="$event.preventDefault()"></form>

已禁用自定义验证器。

Angular 6.x+ 要防止输入任何特定输入,请执行以下操作:

<input type="text" (keydown)="$event.keyCode == 13 ? $event.preventDefault() : null">

Angular 10

$event.preventDefault() 对我不起作用 - $event.stopPropagation 对我有用。