Typescript 角度2(beta3)“;表达式在被选中后已更改;在更新表单值时

Typescript 角度2(beta3)“;表达式在被选中后已更改;在更新表单值时,typescript,angular,angular2-forms,Typescript,Angular,Angular2 Forms,这是我上一篇关于Angular2中嵌套表单(beta 3,带TS)()的文章的一种延续,但我发布了一个新问题,因为它涉及不同类型的问题 您可以在中找到此处所述问题的副本。简言之,在这个虚构的场景中,我有一个组件表示一个虚构字典中的单个单词,另一个子组件用于表示该单词的每个意义;因此,父组件与其子组件之间存在一对多关系。两者都有一个基于表单的模板,使用表单生成器构建。子模板位于NgFor中,我在其中绑定父(=word)模型的每个意义。这样,每个单词意义的所有属性都会自动绑定到单词的模型 其中一些属

这是我上一篇关于Angular2中嵌套表单(beta 3,带TS)()的文章的一种延续,但我发布了一个新问题,因为它涉及不同类型的问题

您可以在中找到此处所述问题的副本。简言之,在这个虚构的场景中,我有一个组件表示一个虚构字典中的单个单词,另一个子组件用于表示该单词的每个意义;因此,父组件与其子组件之间存在一对多关系。两者都有一个基于表单的模板,使用表单生成器构建。子模板位于
NgFor
中,我在其中绑定父(=word)模型的每个意义。这样,每个单词意义的所有属性都会自动绑定到单词的模型

其中一些属性附带了多个验证器(自定义或标准)。我的问题是,当我以编程方式从父组件设置单词模型(这也意味着设置表单控件的值)时,这似乎会在验证过程中触发一些竞争条件,这会引发一些类型为EXCEPTION:Expression'的异常!“definitionCtl.valid”在选中后已更改。上一个值:“true”。当前值:“false”,这将阻止进一步的代码执行

好的,唯一与此问题相关的信息如下:

  • ,

然而,这些讨论似乎并没有为我的问题找到解决方案,除非(如果我理解得很好的话)我选择手动管理我的所有绑定,我希望避免这种情况,因为在现实世界的应用程序中会有很多绑定。有人能帮忙吗?

您可以尝试禁用Angular2开发模式:

import {bootstrap} from 'angular2/platform/browser';
import {App} from './app';
import {enableProdMode} from 'angular2/core';

enableProdMode();

bootstrap(App, [])
  .catch(err => console.error(err));
有关更多详细信息,请参见甘特的答案:


    • 我有这个问题。关于这一点,在美国有很多讨论。我们有不同的情况和解决方案(我刚刚在那一页上列出)

      • 我们的Angular应用程序具有嵌套的模型反应形式,并跨
        ngOnInit()
        中的多个组件构建。其中一些表单在模板中使用
        ngIf
        折叠
      • 数据也在一个
        ngOnInit()
        中读取,并与一个
        modelform.patchValue(数据)
      • 展开其中一个折叠的窗体时出现此错误。这与以下事实有关:没有构建DOM是因为表单是在
        ngOnInit()
        中创建的,该表单在展开之前没有启动。取出
        patchValue()
        ,问题就消失了
      • 我们提出了两个解决方案
      • patchValue()
        之前,运行
        this.\u changedtectionref.detectChanges()。并将
        ngIf
        更改为
        [隐藏]
        ,以便完全构建表单和DOM。缺点是创建完整表单和相关DOM时的时间和内存成本(这在许多应用程序中可能不是问题,但对我们来说是因为我们有一个巨大的表单)
      • 更好的解决方案是在组件中应用
        patchValue()
        (或者
        setValue()
        ,如果数据和字段是1:1),因此只有在
        ngOnInit()中创建表单时才会发生

      我还没有提交这些更改(17年3月22日)。

      谢谢,这很有效!无论如何,我不应该担心DOM和底层模型之间的潜在同步问题吗?希望这些粗糙的边缘能在最终的NG2版本中得到抛光…enableProdMode不是建议的好做法。。否决票,因为这不是一个解决方案。警告消息的存在是有原因的,只是简单地隐藏它们实际上并不能解决根本问题。否决:开发模式警告的存在是有原因的。@Claudiu绝对不是,这不是一个好答案。检查他提供的链接,因为它更牢固。