加深理解自定義控制器

序言

這次主要經過學習老師所寫代碼,更加深刻的學習教程的知識。學習

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監聽了。
相關文章
相關標籤/搜索