Angular2:表单提交取消,因为表单未连接

Angular 2: Form submission canceled because the form is not connected

我有一个包含表单的模态,当模态被销毁时,我在控制台中收到以下错误:

Form submission canceled because the form is not connected

模态被添加到 <modal-placeholder> 元素,它是我的顶级元素 <app-root> 的直接子元素。

从 DOM 中删除表单并消除 Angular 2 中的此错误的正确方法是什么?我目前使用 componentRef.destroy();

发生这种情况可能还有其他原因,但在我的例子中,我有一个按钮被浏览器解释为提交按钮,因此当单击该按钮导致错误时提交了表单。添加 type="button" 解决了这个问题。完整元素:

    <button type="button" (click)="submitForm()">

在表单元素中,您需要定义提交方法 (ngSubmit),例如: <form id="currency-edit" (ngSubmit)="onSubmit(f.value)" #f="ngForm">

并且在提交按钮上省略了点击方法,因为您的表单现在已连接到提交方法: <button class="btn btn-success" type="submit">Save</button>按钮应该是提交类型。

在您实现 "onSubmit" 方法的组件隐藏代码中,例如如下所示: onSubmit(value: ICurrency) { ... } 此方法正在接收一个值对象,其中包含来自表单字段的值。

所以我今天实际上 运行 遇到了完全相同的问题,只是没有涉及模态。在我的表单中,我有两个按钮。一个提交表单,一个点击后返回上一页。

<button class="btn btn-default" routerLink="/events">Cancel</button>
<button type="submit" class="btn btn-primary">Submit</button>

点击带有 routerLink 的第一个按钮确实做了它应该做的事情,但显然也尝试提交表单,然后不得不放弃表单提交,因为表单所在的页面已从DOM 提交期间。

这似乎与发生在您身上的事情完全相同,只是使用模态而不是整个页面。

如果您直接将第二个按钮的类型指定为提交以外的类型,问题就会得到解决。

<button type="button "class="btn btn-default" routerLink="/events">Cancel</button>

因此,如果您通过 'Cancel' 按钮或类似的东西关闭模式,指定该按钮的类型(如上所示)应该可以解决您的问题。

在表单标签中你应该写下:

 <form #myForm="ngForm" (ngSubmit)="onSubmit()">

在表单中你应该有提交按钮:

 <button type="submit"></button>

最重要的是,如果您的表单中有任何其他按钮,您应该向它们添加 type="button"。保留默认的 type 属性 (我认为是submit)会导致警告信息。

<button type="button"></button>

如果提交表单伴随着组件的销毁,表单提交在竞争条件下失败,表单与DOM分离。说,我们有

submitForm() {
  if (this.myForm.invalid) {
    return;
  }
  this.saveData(); // processing Form data
  this.abandonForm(); // change route, close modal, partial template ngIf-destroying etc
}

如果 saveData 是异步的(例如它通过 API 调用保存数据)那么我们可以等待结果:

submitForm() {
  this.saveDataAsync().subscribe(
    () => this.abandonForm(),
    (err) => this.processError(err) // may include abandonForm() call
  );
}

如果您需要立即放弃表单,零延迟方法也应该可行。这保证了 DOM 分离在调用表单提交后进入下一个事件循环:

submitForm() {
  this.saveData();
  setTimeout(() => this.abandonForm());
}

无论按钮类型如何,这都应该有效。

我最近遇到了这个问题,event.preventDefault() 对我有用。 将其添加到您的点击事件方法中。

<button type="submit" (click)="submitForm($event)" mat-raised-button>Save</button>

并且:

submitForm(event: Event) {
  event.preventDefault();
  // ...
}

我在 Angular 6 中看到了这一点,即使根本没有提交按钮。 当同一模板中有多个表单时会发生这种情况。 不确定是否有解决方案/解决方案是什么。

我有这个警告,我将按钮类型 "submit" 更改为 "button" 问题已解决。

如果您仍想将按钮的功能保持为 "submit" 类型,则不应在该按钮上使用单击事件。相反,您应该在表单上使用 ngSubmit 事件。

示例:

<form (ngSubmit)="destroyComponent()">
<button type="submit">submit</button>
</form>

也许您正在路由到表单提交的其他页面。使用编程路线导航,如以下示例所示,而不是将 routerlink 传递到模板中:

router.navigate(['/your/router/path'])

我通过添加属性 type = "button" 解决了这个问题。

<button type="button" onClick={props.formHandler}>Cancel</button>