這次主要經過學習老師所寫代碼,更加深刻的學習教程的知識。學習
咱們能夠學習到:在子組件的value值發生改變時,能夠經過this.xxx.valueChange來監聽子組件input的value的變化,由此彈射數據,使父組件發生改變:
其中fn是彈射的方法,做用是改變父組件formControl的值。
該方法主要是負責初始化子組件formControl的value,接收父組件的初始化的值,賦值給子組件
在教程中咱們並無遇到其使用,可是在項目中咱們遇到了問題:咱們想要在子組件formControl設置爲touched以後,將父組件的formControl也設置爲touched:
本身的解決思路:this
仍是使用this.xxx.valueChange來進行touched的監聽,最後始終沒有效果,便看了老師的代碼:
老師的方法:
spa
viewChild,通常用做組件注入等,在這裏能夠將圖中的總體認爲一個選擇器,檢測與該選擇器對應的元素屬性是否發生改變,若是改變,將執行下圖:
在該方法中:獲取了textArea這個元素並監聽了其blur屬性,若是有改變,則執行this.onTouchedFn:
而this.onTouchedFn即是fn,將父組件的formControl的touched的值設置爲true。
經過在控制檯中打印發現:三者均執行在初始化的時候,而我以前的理解是registerOnChange和resigterOnTouched均執行在value發生改變和點擊的時候執行。code
產生該誤區的緣由是在value發生改變的時候便會執行resigterOnChange的fn方法,把數據監聽的功勞算到了resigterOnChange頭上,可是真正的功勞應該是this.xxx.valueChanges的。由於在初始化的時候執行過resigterOnChange方法,使其被valueChanges監聽了。