【发布时间】:2018-04-05 19:07:30
【问题描述】:
我创建了一个组件,它表示用于修改对象细节的表单。对象存在于app.component.ts:
export class AppComponent {
selectedItem: Item;
}
它通过双向绑定从app.component.html 传入组件,如下所示:
<item-details [(item)]="selectedItem"></item-details>
在组件内,Item 的各个字段绑定到输入控件,以允许用户更新数据,例如:
<mat-form-field class=name>
<input matInput [(ngModel)]="item.name" value="{{item.name}}" required placeholder="Name">
<mat-error>Item name can not be left blank</mat-error>
</mat-form-field>
在我到达 textarea 之前,一切都很好:
<mat-form-field class="full-width">
<textarea id=description matInput [(ngModel)]="item.description" placeholder="Description">{{item.description}}</textarea>
</mat-form-field>
它可以工作,但它会引发异常:
ExpressionChangedAfterItHasBeenCheckedError
该错误与<textarea> 没有直接关系,因为它表示该值从false 变为true,因此似乎与表单上的valid 属性有关,如提示的那样here.
有趣的是,我可以通过修改<textarea></textarea> 的内容来避免该错误,例如在内容后放置一个空格:
<textarea ...>{{item.description}} </textarea>
但这只有在item.description 不是null 时才有效。当它是null 时,我再次收到错误。
我正在触发从另一个子组件对selectedItem 的更改,该子组件在selectedItem 上也具有双向绑定。当用户选择一个项目时,新的Item 会向上流到应用程序,然后返回到详细信息组件。
我已经阅读了Everything you need to know about the 'ExpressionChangedAfterItHasBeenCheckedError' error 的文章。引用文章“我不建议使用它们,而是重新设计您的应用程序”。
太棒了!如何?如何构造事物以便使用控件 A 选择 Item,并使用控件 B 对其进行编辑?控件 A 和 B 在不触发此错误的情况下相互交谈的正确方式是什么?
【问题讨论】:
-
从输入中删除 value="{{item.name}}" 因为它正在无限循环。 ngModel就够了
标签: angular data-binding