从父组件重置表单

Reset form from parent component

我有一个组件,在该组件下有包含子组件的模态弹出窗口:

<modal data-backdrop="static" #modalTask (onDismiss)="modalTask.close()" [size]="'lg'">
    <modal-header>
        <h4 style="color:#fff">Add CRL Task</h4>
    </modal-header>
    <modal-body>
        <TaskComponent [isReset] ="resetForm" #tasks></crlTask>
    </modal-body>
    <modal-footer>
        <button type="button" class="btn btn-primary" (click)="onTaskClick();">Create</button>
        <button type="button" class="btn btn-default" data-dismiss="modal" (click)="modalTask.close();">Cancel</button>
    </modal-footer>
</modal>

现在子组件如下:

<form #taskForm="ngForm" name="rplForm">
 //Contains Input Controls 
</form>

编辑

作为一种解决方案,我将重置放在子组件的 ngOnChanges 中。这是来自子组件的代码

taskForm: FormGroup;
@Input() isReset: boolean = false;

ngOnChanges() {
        if (this.isReset) {
              this.rplForm.reset();
        }
    }

现在我可以在 onTaskClick() 上节省 taskForm,而且我可以这样做。我无法做的是重置子组件下的表单。

我尝试使用 reset() 但没能成功。我可以从父组件使用什么?

创建主题并将更改事件传递给父组件并监听子组件 例如:

// 为此创建一项服务并编写此代码

 onFormReset = new Subject<void>();

   resetForm(): void {
     this.onFormReset.next();
   }

// 组件

reset(): void{
   this.service.resetForm();
}

注。将您的服务注入组件构造函数

//父组件html

<button type="button" class="btn btn-primary" (click)="reset();">Reset</button>

子组件

 ngOnInit(): void {
this.service.onFormReset.subscribe(()=>{
   reset your form here
);
}

您需要使用如下输入:

您的父组件打字稿文件:

private resetForm:boolean = false;

你的父组件html文件:

<modal data-backdrop="static" #modalTask (onDismiss)="modalTask.close()" [size]="'lg'">
<modal-header>
    <h4 style="color:#fff">Add CRL Task</h4>
</modal-header>
<modal-body>
    <TaskComponent #tasks [reset]="resetForm"></crlTask>
</modal-body>
<modal-footer>
    <button type="button" class="btn btn-primary" (click)="onTaskClick();">Create</button>
    <button type="button" class="btn btn-default" data-dismiss="modal" (click)="modalTask.close();">Cancel</button>
</modal-footer>

您的子组件打字稿:

import {Input, OnChanges} from '@angular/core';

@Input() reset:boolean = false;


ngOnChanges(){
   if(this.reset){
       //Here you can reset your form
   }
}

编辑

 <form #taskForm="ngForm" name="rplForm" [formGroup]="rplForm">
   //Contains Input Controls 
 </form>

根据您随 ngOnChanges 提供的更新,您需要使用 NgForm 指令,因为您正在使用模板驱动的表单。 rplForm 而不是 FormGroup,你在这里甚至不需要它,因为它属于反应形式。所以你想要引用的是 taskForm 并重置它。 rplForm 在这里是多余的。

您需要导入 ViewChild 才能引用您的表单,然后在您的表单上调用 reset

import { ViewChild } from '@angular/core';
import { NgForm } from '@angular/forms';

//...

@ViewChild('taskForm') myForm: NgForm;

ngOnChanges() {
  if (this.isReset) {
     this.myForm.reset();
  }
}