ngModelソースの浅い解
前言以前にvueの双方向バインド原理を見たことがあり、簡単なdemoを実現したことがあるが、angularの下で、双方向バインドがどのように実現されているかを説明するのはめったに見られないので、NgModelのソースコードを見て、大同小異を発見し、特に 現在ではngModelがどのように実現されているかについてのみ述べるが、属性バインドや命令に関する知識 には関与しない.この記事では、 を読むには、次の知識が必要です.
カスタムフォームコントロール
応答フォームのFormControl
ngModelは、いくつかの命令を使用していますか?一般的にそう言うと、確かに1つの命令だけを使用していることを意味します.そうしないと、確定した事実を話すのに時間を無駄にしません.
コンポーネントも命令に受け継がれているので、そう言っても間違いないはずです. が使用されます. である. をどのように処理するかなど、バインドを規定する内部論理である.
フローチャート
登録登録とは、その値が変更するときである.実装クラスはどのような方法で変更 を通知すべきか.実装クラスの に変更する.この段階では、合計6つのメソッドが登録されている(ベリファイアは同期、非同期に分けられる) はクラスのregisterOnChangeを実現し、ビューの値が変更すると呼び出し伝達関数 を呼び出す.インプリメンテーションクラスのregisterOnTouched、デフォルトのインプリメンテーションクラスは、フォーカスを失ったときに受信関数 を呼び出す. NgModelのFormControlインスタンスのregisterOnChangeは、値が変化すると、入力関数 を呼び出す. NgModelにおけるFormControlインスタンスにおけるregisterOnDisabledChangeは、状態変化を無効にする場合、実装クラスにおける を呼び出す.ベリファイアの が呼び出される.入力関数は、 入力[ngModel]が入力値が変更されると にキャプチャされる.値が初期値に変更または変更すると、フックの が呼び出される.このメソッドはクラスの をトリガーする.値が変更すると、上記登録方法のうちの3は を受け取る.デフォルトのメソッドでは、変更値を受け取るとangularのレンダラーを利用して が書き込まれる.入力フロー終了 しゅつりょく が呼び出される.関数は、値を受け取ると更新タイミングにあるか否かを判断し、そうであれば更新呼び出し を更新する.この方法は値を更新し、 に変更されたことを送信する.
難点カスタムフォームコントロールの書き方はみんな知っているはずです. ここでは、 を使用する.であり、この命令は構築時に彼の が確立する.
ソースコメントソースコードを见る时も立面の関数に対して、方法はすでに関连する文に注釈をして、もしみんなが上のがまだはっきりしないことを见るならば、注釈のソースコードを参照することができて、あなた达に を助けることができることを望みます ng_model.ts shared.ts default_value_accessor.ts
疑問どこかに記載されている問題や間違っているものがあれば、貴重な意見をたくさん提出してください.
カスタムフォームコントロール
応答フォームのFormControl
ngModelは、いくつかの命令を使用していますか?
コンポーネントも命令に受け継がれているので、そう言っても間違いないはずです.
NgModel
とControlValueAccessor
、NgModel
を使用する場合は、実際には2つの命令NgModel
は、いくつかの関数の登録を担当し、すべてのControlValueAccessor
が実装する4つの方法(オプションの無効化方法)は、最終的にはNgModel
によって使用されるControlValueAccessor
は、送信値がいつ変更するか、値書き込みが発生したときにフローチャート
登録
registerOnChange(fn)
,fnは登録フェーズで入力され、このフェーズで .registerOnChange(fn)
が呼び出されると、関数は実装クラスに付与され、値が変更されると実装クラスが呼び出され、この関数通知値はsetDisabledState
メソッドregisterOnValidatorChange
ベリファイアの入力属性が変化すると、入力関数shared.ts
ファイルに書かれているNgModel
のngOnchanges
フックによりthis._updateValue(this.model)
FormControl
の値変更
を実行し、関数では実装クラスのwriteValue
メソッドがトリガーされ、このとき実装クラスは変更値input
要素のvalueにinput
またはcompositionend
のイベントのときに、着信関数onChange
が呼び出される.blur
イベントの場合、入力関数onTouched
NgModel
のviewToModelUpdate
ngModelChange
の通知値が難点
ngModel
inputプロパティとngModelChange
outputイベントは書いたことがありませんが、ControlValueAccessor
類を実現した後、不思議に実現しました.NgModel
命令のセレクタが[ngModel]:not([formControlName]):not([formControl])
であるため、すなわち、応答式フォームでない限り、ngModel付きのすべての命令は自動的にこの命令ControlValueAccessor
を探し、発見後、いくつかの変更が必要な関数を
に通知することによって関連ソースコメント
疑問