加深理解自定义控制器

序言

这次主要经过学习老师所写代码,更加深刻的学习教程的知识。学习

1、自定义控制器的理解

1.registerOnChange

咱们能够学习到:在子组件的value值发生改变时,能够经过this.xxx.valueChange来监听子组件input的value的变化,由此弹射数据,使父组件发生改变:

image.png

其中fn是弹射的方法,做用是改变父组件formControl的值。

2.writeValue

该方法主要是负责初始化子组件formControl的value,接收父组件的初始化的值,赋值给子组件

image.png

3.registerOnTouched

在教程中咱们并无遇到其使用,可是在项目中咱们遇到了问题:咱们想要在子组件formControl设置为touched以后,将父组件的formControl也设置为touched:

解决:

本身的解决思路:this

仍是使用this.xxx.valueChange来进行touched的监听,最后始终没有效果,便看了老师的代码:

老师的方法:
image.pngspa

viewChild,通常用做组件注入等,在这里能够将图中的总体认为一个选择器,检测与该选择器对应的元素属性是否发生改变,若是改变,将执行下图:

image.png

在该方法中:获取了textArea这个元素并监听了其blur属性,若是有改变,则执行this.onTouchedFn:

image.png

而this.onTouchedFn即是fn,将父组件的formControl的touched的值设置为true。

过程当中遇到的问题:

经过在控制台中打印发现:三者均执行在初始化的时候,而我以前的理解是registerOnChange和resigterOnTouched均执行在value发生改变和点击的时候执行。code

产生该误区的缘由是在value发生改变的时候便会执行resigterOnChange的fn方法,把数据监听的功劳算到了resigterOnChange头上,可是真正的功劳应该是this.xxx.valueChanges的。由于在初始化的时候执行过resigterOnChange方法,使其被valueChanges监听了。
相关文章
相关标签/搜索