Angular Form 的一些问答
如何理解FormGroup, FormArray, FormControl
?
它们可以映射成对象,数组,原生字段
FormGroup 上的invalid 字段是如何获取整个表单的状态的?
- 首先,它的状态是存在于它内部的Status字段。
- 其次,每单它内部的一个节点有值的改动,会调用updateValueAndValidity()方法,而且改方法是递归它的parent 调用的。在FormGroup 内部它会递归遍历它的孩子获取每个节点的状态,从而得到了表单的状态。
简单来说,只有有一个节点触发了上述的方法,并且冒泡到了根节点,那么表单根节点的状态就计算更新了
FormGroup上是如何获取到表单的值的。
- 它是通过递归调用它的孩子得到整个值得
某个节点更新值了,会发生哪些事?
- 首先,它会更新节点自己得值,重置本身得状态。
- 然后触发自身得validator, 先触发同步得validator, 如果通过,则触发异步的validator, 从而得到最终的状态值。!!!!!注意这一步只有在enabled 的状态下才会做
- 如果参数中指明发事件(opt.emitEvent),则会发布ValueChanges, StatusChanges 事件
- 如果参数中指明冒泡事件(opt.onlySelf==false),则递归这个流程到父级,直到根节点。
有时某个节点的验证需要其他节点的参与,这边又两个问题
- 如何获取整个表单的值,可以通过FormControl的parent 递归得到根节点,从而得到整个表单的值
- 如何触发其他节点的validator,可以通过根节点找到相关联的节点,然后调用它的updateValueAndValidatiy({onlySelf:true,emitEvent:false});