【问题标题】:How to use reactive forms inside ng-template如何在 ng-template 中使用响应式表单
【发布时间】:2017-08-17 18:29:27
【问题描述】:

我刚开始使用 Angular 4,我需要开发一个 CRUD 网格,用户可以在其中添加、编辑或删除行。

在我的研究过程中,我发现这篇文章展示了如何创建网格以及操作:Angular 4 Grid with CRUD operations

查看他的代码,引起我注意的是他使用 ng-template 在编辑/查看模式之间切换的方式。

<tr *ngFor="let emp of EMPLOYEES;let i=idx">
 <ng-template [ngTemplateOutlet]="loadTemplate(emp)" [ngOutletContext]="{ $implicit: emp, idx: i }"></ng-template>
</tr>

在文章中,他使用模板驱动的表单来编辑行。但是,我试图更改为反应形式。

在尝试这样做时,我尝试将 [(ngModel)] 替换为 formControlName,但出现了一些错误。我的第一次尝试是在表单元素内的模板 html 开头添加 [formGroup]。但是当我尝试运行和编辑该行时,出现以下错误:

Error: formControlName must be used with a parent formGroup directive.  You'll want to add a formGroup directive and pass it an existing FormGroup instance (you can create one in your class).

当我尝试在 ng-template 中移动 [formGroup] 时,它可以工作,但是我无法将值绑定到字段,我必须在 loadTemplate 函数中设置值:

loadTemplate(emp: Employee) {
    if (this.selemp && this.selemp.id === emp.id) {

        this.rForm.setValue({
            id: emp.id,
            name: emp.name
        });

        return this.editTemplate;
    } else {
        return this.readOnlyTemplate;
    }
}

这有效并以只读模式显示字段内的值:(

这是我目前得到的Plunker

如何使反应式表单与 ng-template 一起使用以及如何设置值以编辑条目?

感谢任何帮助!谢谢

【问题讨论】:

  • 我删除并取消删除了我的答案,所以你不会收到通知,所以我在这里告诉它:) 重新考虑你的代码,正如你从我的回答中看到的那样,这对性能造成了很大的伤害。

标签: javascript angular templates


【解决方案1】:

实际上您的表单不是只读的,您只是不断地覆盖您正在输入的输入。由于您在模板中有一个方法调用(这通常不是一个好主意),所以每当发生更改时都会调用loadTemplate,这反过来意味着

this.rForm.setValue({
   id: emp.id,
   name: emp.name
});

每当您尝试输入任何内容时都会一遍又一遍地调用。当您单击编辑时,我们可以通过设置表单值来克服这个问题。在这里我们还存储了索引,以便我们可以使用它来将修改后的值设置在数组中的正确位置,利用索引也许可以以更智能的方式完成,但这是实现我们想要的快速解决方案。

editEmployee(emp: Employee) {
    this.index = this.EMPLOYEES.indexOf(emp) 
    this.selemp = emp;
    this.rForm.setValue({
      id: emp.id,
      name: emp.name
    });
}

所以当我们点击保存时,我们使用那个索引...

saveEmp(formValues) {
  this.EMPLOYEES[this.index] = formValues;
  this.selemp = null;
    this.rForm.setValue({
      id: '',
      name: ''
    });

}

你的笨蛋:https://plnkr.co/edit/6QyPmqsbUd6gzi2RhgPp?p=preview

但请注意...

我建议你也许重新考虑这个想法,在模板中使用方法loadTemplate,会导致该方法触发太多。您可以在 plunker 中看到,每当它被触发时,我们都会在其中控制台日志 fired!,所以它很多!根据具体情况,这可能会导致严重的性能问题,因此请记住这一点 :)

PS。对代码进行了一些其他更改,以添加新员工以正常工作(与问题无关)

【讨论】:

  • 非常感谢您帮助我理解问题。我发现了这个ng2-smart-table,我会试一试。它并不完美,但至少在开发初期会对我们有所帮助。
猜你喜欢
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-13
  • 2019-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多