[英]Angular2: NgForm should be dirty but it is not
这是模板
<time-shift-input
[start]="editingUser.defaultStart"
[startLabel]="'profile.defaultStart' | translate "
[end]="editingUser.defaultEnd"
[endLabel]="'profile.defaultEnd' | translate "
(onChange)="onShiftTimes($event)"></time-shift-input>
<input type="hidden" name="defaultStart" [ngModel]="editingUser.defaultStart">
<input type="hidden" name="defaultEnd" [ngModel]="editingUser.defaultEnd">
这是组件
onShiftTimes(e) {
if ( !e.errors ) {
this.editingUser.defaultStart = e.start;
this.editingUser.defaultEnd = e.end;
}
}
ngOnInit() {
this.profileForm.valueChanges.subscribe( () => {
if ( this.profileForm.dirty ) {
this.saveComponent.hasNew(true);
if ( this.profileForm.valid ) {
this.saveComponent.enabled = true;
}
} else {
this.saveComponent.hasNew(false);
this.saveComponent.enabled = false;
}
});
}
time-shift-input组件发出一个事件,该组件调用onShiftTimes方法,该表单触发valueChanges,但是该表单仍然很脏:false,pristine:true
为什么?
这是警告和解决方案。 以编程方式设置值不会触发更改检测,如在其他地方标记的那样- 当属性由Observable / subscrption更改时,ngOnChanges不触发
但是,添加吸气剂后,问题仍然存在,只有隐式触发this.profileForm.control.markAsDirty()
后,问题才能解决。 所以在上面的例子中
onShiftTimes(e) {
if ( !e.errors ) {
this.editingUser.defaultStart = e.start;
this.editingUser.defaultEnd = e.end;
this.profileForm.control.markAsDirty();
}
}
干杯。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.