2017-07-18 63 views
1

一直在考虑针对表单实现异步custom validator,该表单的唯一目的是与微服务进行通信,以便从人的ID号码中提取信息(如年龄,出生日期,性别比赛等),当然是否根据他们发送的国家ID号是否有效。Angular 2 - 具有微服务的反应形式异步验证

所以如果一个人输入他们的ID号码并选择一个国家,一个请求就会被引发到一个微服务,如果他们没有设置他们的性别,它会自动填充它,然后他们可以改变它如果需要的话。

问题

  1. 是好/ OK实践根据以下情形的验证设置其他形式的控制值?
  2. 如果是这样,我将如何去修改其他窗体控件值?

任何帮助,将不胜感激:)

+1

一个验证不应该设置窗体的任何值,它应该只验证。 – Chrillewoodz

回答

1

就像我说的评论,一个验证器不应该设置或更新表单控件,组或数组的值。它只应该验证。

但是,您可以做的是使用.valueChanges来侦听窗体的更改,并在回调中检查某个控件是否有效,并相应地更新其他控件。

下面是一个例子:

this.form.get('someControl').valueChanges(() => { 

    if (this.form.get('someControl').valid) { 
    this.form.get('someOtherControl').setValue(true); 
    } 
}); 
+0

出于好奇,是否记录在某个地方,在验证器中添加这样的逻辑,因为这是一种非常不寻常的情况?它确实有意义,但你完全分离的逻辑,但可能 最终将您的答案标记为正确 –

+1

不是我所知道的,但名称本身使它非常清楚。我认为在官方风格指南的某个地方提到你应该创建“纯粹”功能,这意味着它们没有任何副作用。验证函数修改某些其他控件会破坏该模式,因此它只应验证,然后您会在其他位置执行其他操作。 – Chrillewoodz

+0

是有道理的,谢谢你的提示反馈队友:) –