Angular表单提交事件在父组件和子组件之间触发两次

Rem*_*tec 16 javascript forms typescript angular-components angular

我有一个奇怪的问题,我的子表单的表单提交事件在我的父表单上触发了两次.

child.component.html

<form [formGroup]="childForm" (ngSubmit)="childFormSubmit()">
  ...
</form>
Run Code Online (Sandbox Code Playgroud)

child.component.ts

@Component({
  selector: 'child-form',
  templateUrl: 'login.component.html',
})

export class ChildComponent {
  @Output() submit = new EventEmitter<any>();

  public childForm: FormGroup;

  childFormSubmit() {
    if (this.childForm.valid) {
      console.log('Child Form Submit')
      this.submit.emit(this.childForm.value);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

parent.component.html

<child-form (submit)="parentSubmit($event)"></child-form>
Run Code Online (Sandbox Code Playgroud)

parent.component.ts

@Component({
  selector: 'parent',
  templateUrl: 'parent.component.html',
})

export class ParentComponent {

  constructor() {
  }

  parentSubmit(event: any) {
    console.log('Parent Submit');
  }
}
Run Code Online (Sandbox Code Playgroud)

提交子表单会在控制台输出中产生以下结果:

Child Form Submit
Parent Submit
Parent Submit
Run Code Online (Sandbox Code Playgroud)

Veg*_*ega 39

您已在子组件上使用保留字'submit'作为装饰器功能和属性.因此,如果您在父组件中有表单(submit)(相当于(ngSubmit)),则会与子项中的事件同时触发.将其更改为其他内容,如下所示:

<child-form (childSubmit)="parentSubmit($event)"></child-form>
Run Code Online (Sandbox Code Playgroud)

在子组件中:

 @Output() childSubmit = new EventEmitter<any>();
 ...
 childFormSubmit() {
   if (this.childForm.valid) {
         console.log('Child Form Submit')
         this.childSubmit.emit();
   }
 }
Run Code Online (Sandbox Code Playgroud)

这是一个有效的DEMO

  • 就是这样.现在修复了.谢谢. (3认同)
  • 这太令人沮丧了,我只将输出属性命名为“submit”,因为 Angular 的 lint 强加“输出属性不应以 on 为前缀”。 (2认同)