带有 ngmodel 的 Angular 2 动态表单示例导致“表达式在检查后已更改”

Posted

技术标签:

【中文标题】带有 ngmodel 的 Angular 2 动态表单示例导致“表达式在检查后已更改”【英文标题】:Angular 2 dynamic forms example with ngmodel results in "expression has changed after it was checked" 【发布时间】:2017-06-17 15:32:35 【问题描述】:

我希望使用 Angular 文档中提供的 example 来结合 [(ngmodel)] 来利用动态表单。以便动态表单控件可以绑定到模型。

但是,当我尝试将控件绑定到 [(ngMode)] 时,我看到了错误消息

表达式在检查后发生了变化。以前的值:“假”。当前值:'true'。

Here 是一个带有更改的示例 Plunker。

我修改了 QuestionBase 类来保存一个键

export class QuestionBase<T>
      ...
      modelKey:string;
      ...

在 QuestionService 中,每个问题现在都有它应该更新的模型的名称

  new TextboxQuestion(
          ...
          modelKey: 'firstName'
  ),

在 DynamicFormQuestionComponent 中,模型作为输入变量传入

  export class DynamicFormQuestionComponent 
        ...
        @Input() model: SampleModel;
        ...
  

DynamicFormQuestionComponent html 字段已修改为使用 [(ngModel)]

<input *ngSwitchCase="'textbox'" [formControlName]="question.key"
        [id]="question.key" [type]="question.type" [(ngModel)]="model[question.modelKey]">

这里的控件应该绑定到解析的'model[question.modelKey]'

鉴于官方文档中提供的示例中没有使用 [(ngModel)]。

感谢任何帮助。

谢谢。

【问题讨论】:

双向绑定 ngModel 用于模板驱动的表单,而不是动态响应式表单 很抱歉无法通过 plunkr.. 但是以下两个资源将有助于您对比如何做模板驱动与反应式的事情:* Angular 2 Forms Video | Kara Erickson, * Angular 2 Forms Repo | Kara Erickson, * NgModel, * FormControl. 感谢您的链接。我没有意识到你不能把两者混在一起。 【参考方案1】:

很高兴你发现它有帮助.. 以后我会把它留在这里给其他人..

双向绑定ngModel 专为模板驱动的表单而设计,而不是 比动态反应形式。

以下资源将有助于您对比如何做 “模板驱动”方式与“动态反应”方式:

Angular 2 Forms Video | Kara Erickson Angular 2 Forms Repo | Kara Erickson NgModel FormControl

【讨论】:

【参考方案2】:

如果您想使用ngModel,那么您还需要在该控件上设置名称:

[(ngModel)]="model[question.modelKey]" [name]="question.key"

我在您的示例 plunkr 中尝试了这个,它允许绑定回模型.. 但现在在绑定 *ngIfisValid 时会引发一些其他错误。

简而言之,看起来你可以混合使用这两者.. 但是你有ngModelFormGroup.value 都捕获相同的数据,这很令人困惑。

我还没有发现需要尝试混合这些,如果您使用的是动态表单,请让它完成工作,然后在需要时获取值(保存/提交时)。如果你试图混合它们,你可能会自找麻烦

【讨论】:

以上是关于带有 ngmodel 的 Angular 2 动态表单示例导致“表达式在检查后已更改”的主要内容,如果未能解决你的问题,请参考以下文章

将 ngModel 绑定到动态复选框列表:Angular 2 / Typescript

带有 ControlValueAccessor 测试的 Angular 2(4) 组件

带有 ngFor 输入的 Angular 2 模板驱动表单

Angular 2,选择选项问题

Angular7 - [ngModel] 不会在组件中更新,当两次输入相同的值时

Angular - 在 ngInclude 中调用时 ngModel 不更新