我可以在Form数据和表单控件之间创建某种“中介”吗?

时间:2018-02-28 13:33:23

标签: angular angular-reactive-forms

我的模型具有自定义属性类型TimeSpan。我想使用[form]kendo-timepicker中对其进行编辑,但需要Date个对象。

有没有办法可以创建一个指令来拦截控件和底层的ngControl,以便我可以在TimeSpanDate之间进行转换?

我宁愿不必创建一个看起来与模型相同但具有不同属性类型的新类。

1 个答案:

答案 0 :(得分:0)

我这样做的方法是在保存映射表单的地方添加一个额外的变量。所以像这样:

mappedForm={};
constructor(....){...}


ngOnInit() {
   this.myForm.valueChanges.subscribe(form => {
     form.property =  parseInt(form.property, null);
     this.mappedForm = form;
   })    
}

在这种情况下,我将字符串映射到数字,但您可以使用' as'用于映射更复杂数据结构的关键字。另外,根据您的情况,您可以使用map并使用正确的值来观察,而不是像我一样订阅。另请注意,mappedForm只是表单值的快照,不包含其他属性。

编辑如果您想重新更新表单控件

如果要重置表单控件值,可能需要使用辅助布尔值,这样就不会陷入无限循环。

ngOnInit() {
let isFirst = false;
this.myForm.valueChanges.subscribe(form => {
  form.prop = parseInt(form.prop , null);//replace with you mapping
  if (isFirst) {
    this.myForm.patchValue(form);
    isFirst = !isFirst;
  } 
})
}