繁体   English   中英

Angular2:NgForm应该是脏的,但不是

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM