避免 Angular2 在按钮点击时系统地提交表单

IT技术 javascript forms angular submit
2021-03-14 21:57:30

好吧,也许这还不清楚。得到这个表格:

<form (ngSubmit)="submit()" #crisisForm="ngForm">
   <input type="text" name="name" [(ngModel)]="crisis.name">
   <button type="submit">Submit</button>
   <button type="button" (click)="preview()">Preview</button>
   <button type="reset" (click)="reset()">Reset</button>
</form>

为什么所有按钮都会触发该submit()功能?以及如何避免这种情况?

6个回答

我看到两个解决方案:

1)明确指定type="button"(我认为它更可取):

<button type="button" (click)="preview();">Preview</button>

根据W3规范:

2)使用$event.preventDefault()

<button (click)="preview(); $event.preventDefault()">Preview</button>

或者

<button (click)="preview($event);">Preview</button>

preview(e){
  e.preventDefault();
  console.log('preview')
}
@Günter Zöchbauer 非常感谢您指出这一点!首先我试过了,但我写了return false,但没有用:)
2021-04-25 21:57:30
(click)="preview(); false"应该这样做。例如stopPropagation(),需要显式调用,但如果事件处理程序返回false,则preventDefault在事件上调用。
2021-04-26 21:57:30
使用 #2 似乎是最好的答案。只需添加:type="button" 到我的按钮就解决了问题
2021-04-26 21:57:30
return 绑定表达式中可能不允许,但最后一个表达式的值是隐式返回的。
2021-05-10 21:57:30
我不知道type=buttonW3C 的规范。谢谢!!
2021-05-12 21:57:30

这个 Plunker建议否则,每个按钮似乎都按预期工作。

但是,为了防止表单的默认行为,您可以这样做,


TS:

submit(e){
 e.preventDefault();
}

模板:

<form (submit)="submit($event)" #crisisForm="ngForm">
感谢您的回答和 plnkr ... 这都是关于按钮类型plnkr.co/edit/BKIqcz7aKBFQDZioZ5Fy
2021-05-02 21:57:30
的确 !它是。并且您已经定义了所有按钮,因此它按预期工作
2021-05-06 21:57:30

您必须从 app.module.ts 中的“@angular/forms”导入 FormsModule

import { FormsModule } from '@angular/forms';
 @NgModule({
  imports: [
    FormsModule
 ],
 })

我发现 2.0 版本(ngSubmit)正在将null事件值传递给该方法,因此您应该我们(submit)

<form (submit)="submit($event)" #crisisForm="ngForm">

你的 .ts 文件

submit($event){
   /* form code */
   $event.preventDefault();
}
谢谢!这有效,不知道为什么 ngSubmit 在不用作表单组时可以工作,但是当我将其用作表单组时,我必须使用您的解决方案
2021-05-09 21:57:30
我在 2.0 刚刚发布时给出了这个答案,但是在那之后 angular 2 已经走了很长一段路,所以你确定你使用的是最新的发布版本吗?
2021-05-11 21:57:30

在不想执行提交的按钮中设置type="button"