14

我在 Angular 2+ 应用程序中使用反应式表单,并且需要将主 FormGroup 传递给多个组件,以便可以在单独的组件中管理表单的不同部分,例如页眉、页脚等,并由这些不同的组件填充。这就是我目前的做法:

<div class="container-fluid">
  <form [formGroup]="orderForm">
    <order-header [orderForm]="orderForm"></order-header>
    <order-items [orderForm]="orderForm"></order-items>
    <order-footer [orderForm]="orderForm"></order-footer>
  </form>
</div>

我想知道,如果这是一个正确的方法,因为我确实看到了这个代码的警告/错误:

ERROR 错误:ExpressionChangedAfterItHasBeenCheckedError:表达式在检查后已更改。以前的值:“真”。当前值:“假”。

在这条线上:

<form [formGroup]="orderForm">

有什么建议么?谢谢。

4

2 回答 2

19

正如 Julia 所说,这是正常行为。

实际上是@Input您的组件中导致了这种情况,而不是线路<form [formGroup]="orderForm">

这发生在开发模式下。解决此问题的方法是手动触发接收orderForm. 由于您正在使用@Input,因此您可以ngOnChanges在其他组件中使用生命周期挂钩:

import { ChangeDetectorRef } from '@angular/core';

@Input() orderForm: FormGroup

constructor(private ref: ChangeDetectorRef) { }

ngOnChanges() {
  this.ref.detectChanges()
}

在此处查看有关您的错误的更多信息:Expression ___ has changed after it was checked

另外,作为旁注,您是否真的需要将完整的表单传递给您的其他组件。通常我们只传递组件将处理的嵌套组,所以像这样:

<form [formGroup]="orderForm">
  <order-header [orderForm]="orderForm.controls.myNestedGroupName"></order-header>
</form>

就像旁注一样!:)

于 2017-05-02T06:39:14.163 回答
1

你做对了。开发模式下的 Angular 执行两个更改检测周期。一个是正​​常的,第二个是检查所有第一次和第二次调用的函数是否返回相同的结果。检查您的所有 @Input 或从模板调用以呈现值的函数不会改变值。

例如,这个组件会抛出这个异常,因为 long() 函数总是返回不同的值。

@Component({
  selector: 'my-app',
  template: `
      {{long()}}
  `,
})
export class App {
  name:string;
  i=0;

  constructor() {
    this.name = `Angular! v${VERSION.full}`
  }

  long(){
    return this.i++;
  }
}
于 2017-05-01T22:45:30.130 回答