我有以下表格输入:
<div [ngClass]="{selected: roleName.valid}">
<input type="text" [(ngModel)]="model.RoleName" ngControl="roleName" #roleName="ngForm" id="roleName" />
</div>
我在OnInit事件中绑定模型。问题是我收到以下错误:
Expression '{selected: roleName.valid} in RoleEditComponent@8:21' has changed after it was checked. Previous value: 'null'. Current value: 'false' in [{selected: roleName.valid}
我知道我可以禁用此错误启用prod模式,但我不确定这是不是一个好主意。我的方法有什么问题,如何解决这个问题?
修改
我刚刚意识到这种情况甚至没有设置模型。示例代码:http://plnkr.co/edit/dFlxNAfC0VRy9BtRampW?p=preview
答案 0 :(得分:1)
<强>更新强>
我认为当以这种方式访问控件的属性时,这是一个已知问题(https://github.com/angular/angular/issues/8139)。
如果从表单中获取控件引用,则不会发生错误。
<form [ngFormModel]="form" form="ngForm">
<div [ngClass]="{'has-error': form.controls.roleName.valid}">
<input type="text" [(ngModel)]="model.RoleName" ngControl="roleName" #roleName="ngForm" id="roleName" />
</div>
</form>`,
另见Angular2 and disabling button exception
<强>原始强>
ngOnInit()
是由Angulars变量检测调用的生命周期回调。角度变化检测不喜欢它的动作导致模型更改。这通常是“表达式x在......之后发生了变化”的原因。
您可以将代码在ngOnInit()
中包装到setTimeout(() => ...)
中,以便在更改检测生命周期回调完成后延迟执行,或者将其移动到其他位置(例如构造函数)。