2017-02-27 55 views
1

这里是模板Angular2:NgForm应该是脏但它不是

  <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; 
    } 

    }); 
} 

时移输入组件发出一个事件,组分调用onShiftTimes方法,所述形式触发valueChanges,然而形式仍然是脏:假,原始:真

为什么?

+0

您可以检查是否'defaultStart'和'defaultEnd'真正得到列入形式?尝试访问父'ngForm'对象的'controls'属性,甚至访问其'value'属性,看看它们是否在那里。如果它们不是,它可能与它们隐藏的事实有关,或者根本不受双向约束。 – Amit

+0

在阅读完之后 - http://stackoverflow.com/questions/39913255/ngonchanges-not-firing-when-attribute-changed-by-observable-subscrption - 我已经添加了两个setter方法的两个属性。是的,当我打印form.value时,值正在按预期更新。在我处理字符串时,我甚至添加了'''+ this.editingUser.defaultStart',因此基本上不返回对现有值的引用,而是返回一个新值。问题依然存在。 – pop

回答

1

这里是警告和解决方案。 设定值编程将不会触发变化检测,如在别处标 - ngOnChanges not firing when attribute changed by Observable/subscrption

加入干将后,虽然问题依然存在,只有触发this.profileForm.control.markAsDirty()隐含后可以解决。所以在上面的例子中,

onShiftTimes(e) { 
    if (!e.errors) { 
    this.editingUser.defaultStart = e.start; 
    this.editingUser.defaultEnd = e.end; 
    this.profileForm.control.markAsDirty(); 
    } 
    } 

干杯。