angular1 の学習ノート。angularjs でのビュー モデルの同期プロセスが含まれています。
これはangularjsの個人的な理解メモです。ここで、皆さんに見てもらえるように書いてみましょう
事の発端は、プロジェクトAでの出会いです。小さな問題: このプロジェクトには販売数量を入力するための入力ボックスが必要ですが、ユーザーが入力した後、入力データに基づいて手数料が計算されます。当然ng-modelとng-changeを使用しましたが、概ね問題ありません。問題は、入力ボックスの下にすべて売却するボタンがあることです。このボタンをクリックすると、売却額が自動的に設定されます。しかし実際には、この時点ではプログラムは手数料を計算しません。
トラブルシューティングを行ってドキュメントを調べた結果、ng-change に問題があることがわかりました。 ng-change プロンプトに関する Angular の公式ドキュメント:
値の変更がモデルから来る場合、式は評価されません:
ng-change のソース コードも非常に単純です:
var ngChangeDirective = valueFn({ restrict: 'A', require: 'ngModel', link: function(scope, element, attr, ctrl) { ctrl.$viewChangeListeners.push(function() { scope.$eval(attr.ngChange); }); } });
そこから ng-change も確認できます。ビューからモデルまでの監視のみが行われます。そのため、js で ng-model の変数を直接変更しても、ng-change はトリガーされません。
問題が見つかったので、解決策は難しくありません。ng-change を放棄して、代わりに $watch を使用してください。
でも、もう終わりですか?ビューの変更からモデルの同期更新まで、変数は正確に何を経るのでしょうか?逆も同じですか?
そこで、ng-model のソースコードをもう一度見てみたところ、何も見つかりませんでしたが、予想外に次のことを学びました。
ng-change はモデルの値が変更される前に実行されるということです。 ng-model のソース コードにはそのような関数があります:
function setupModelWatcher(ctrl) { // model -> value // !!!Note: we cannot use a normal scope.$watch as we want to detect the following: // !!!1. scope value is 'a' // !!! 2. user enters 'b' // !!!3. ng-change kicks in and reverts scope value to 'a' // -> scope value did not change since the last digest as // ng-change executes in apply phase // !!!4. view should be changed back to 'a' ctrl.$$scope.$watch(function ngModelWatch(scope) { var modelValue = ctrl.$$ngModelGet(scope); // if scope model value and ngModel value are out of sync // This cannot be moved to the action function, because it would not catch the // case where the model is changed in the ngChange function or the model setter if (modelValue !== ctrl.$modelValue && // checks for NaN is needed to allow setting the model to NaN when there's an asyncValidator // eslint-disable-next-line no-self-compare (ctrl.$modelValue === ctrl.$modelValue || modelValue === modelValue) ) { ctrl.$$setModelValue(modelValue); } return modelValue; }); }
中のコメントは、なぜ ng-change の後に変数モデルの値を変更する必要があるのかを説明しています。ng-change は変数の値を元に戻す可能性が高いため、変数がvalue 実際、それは変わっていません (API を作成するときは、あらゆる状況を考慮する必要があります!!)。この質問と以前の質問に関して、デモ コードは次のとおりです: http://php.cn/course/47.html
ソース コードを見ても何も得られないので、オンラインで記事を検索してください。このプロセス中に良い記事を見つけました。この記事では
$formatters
、$parsers
、$render
、および $setViewValue。もうここでは紹介しません。学習する必要がある場合は、原文はここにあります: http://php.cn/course/47.html<code>$formatters
,$parsers
,$render
以及$setViewValue
。这里就不再介绍了,如果需要学习,原文在这里:http://php.cn/course/47.html
在学习$setViewValue
时也发现一个很容易被坑的点:在调用$setViewValue
时,如果参数是引用变量,那么如果引用变量地址没变,则这个变量被认为没有改变,如 var map = [‘er’, ’tr’];那么map.pop();之后$setViewValue并不认为map值改变了。关于这个具体可以看我对这个问题的回答。(想看更多就到PHP中文网AngularJS开发手册中学习)
ng-model也有这个问题,这个在ng-model源码注释中可以看到:
However, custom controls might also pass objects to this method. In
this case, we should make a copy of the object before passing it to$setViewValue
. This is becausengModel
does not perform a deep
watch of objects, it only looks for a change of identity.If you only change the property of the object then ngModel will not
realize that the object has changed and will not invoke the$parsers
and$validators
pipelines.
从上面也可以看到其实一个变量的更新由view到model和model到view不止$formatters
和$parsers
管道,那么还有哪些呢?
在查了一圈资料后找到一个很清晰的解释:https://stackoverflow.com/que...,大家其实只需要看问题的回答,问题实在太长了。。。
这个回答中有个demo链接,我copy了一下并做了写小修改放在这个地址了:http://php.cn/course/47.html,这个demo很清晰的显示了变量更新的过程,细节就不再累述了,这里只把结果总结如下:
从model到view:
model值修改 ----> $formatters
管道 ----> $render
函数 ----> $validators
----> $watch
函数
从view到model:
view值修改 ----> $setViewValue
函数----> $parsers
管道 ----> $validators
----> $viewChangeListener
函数 ----> $watch
函数
我们也可以直接调用$setViewValue
函数去直接改变$viewValue
的值,流程会和上面一样。
注意在使用$setViewValue
时一定要警惕参数是引用变量的情况,这个坑在上文也已经提到了。
本文没有具体介绍$formatters
和 $parsers
$setViewValue
を学習していたとき、ポイント: $setViewValue
を呼び出すとき、パラメータが参照変数の場合、参照変数のアドレスが変更されていない場合、その変数は変更されていないと見なされます。 as var map = ['er', 'tr'] ;$setViewValue は、map.pop() の後にマップ値が変更されたとはみなしません。詳細については、この質問に対する私の回答を参照してください。 (さらに詳しく知りたい場合は、PHP 中国語 Web サイトAngularJS 開発マニュアル🎜 にアクセスして学習してください)🎜🎜ng-モデルにもこの問題があり、これは ng-model のソース コードのコメントで確認できます: 🎜🎜ただし、カスタム コントロールもこのメソッドにオブジェクトを渡す可能性があります。この場合、前にオブジェクトのコピーを作成する必要があります。それを🎜🎜また、上記のことから、ビューからモデルへ、モデルからビューへ変数を更新するためのパイプラインは、実際には$setViewValue
に渡します。これは、ngModel
がオブジェクトの詳細な監視を実行せず、アイデンティティの変更のみを検索するためです。オブジェクトのプロパティを使用すると、ngModel はオブジェクトが変更されたことを認識せず、$parsers
🎜 および$validators
パイプラインを呼び出しません。🎜
$formatters
と $parsers
だけではありません。他に何があるのかもわかります。 ? 🎜🎜多くの情報をチェックした結果、非常に明確な説明を見つけました: https://stackoverflow.com/que... 実際、質問に対する答えを読むだけで十分です。質問は長すぎます。 。 。 🎜この回答にはデモリンクがあり、それをコピーして少し変更し、次のアドレスに置きました: http://php.cn/course/47.html このデモは変数更新のプロセスを明確に示しています。詳細は繰り返しませんが、ここでは次のように結果を要約するだけです。 🎜モデルからビューへ: 🎜モデル値の変更----> $formatters
Pipeline----> $render
関数 ----> $validators
----> $watch
関数 🎜🎜ビューからモデルへ: 🎜ビューの値の変更 - ---> $setViewValue
関数---> $parsers
パイプライン---> $validators
--- - > $viewChangeListener
関数 ----> $watch
関数🎜 $setViewValue
関数を直接呼び出して、 を直接変更することもできます。 >$viewValue
の値、処理は上記と同じになります。 🎜 $setViewValue
を使用する場合は、変数を参照するパラメーターに注意する必要があることに注意してください。この落とし穴についても上で説明しました。 🎜🎜この記事では、$formatters
パイプラインと $parsers
パイプラインについては特に紹介しません。この部分については、記事内にあるリンクを参照してください。この記事はここで終わります (さらに詳しく知りたい場合は、PHP 中国語 Web サイト AngularJS ユーザー マニュアル にアクセスして学習してください)。ご質問がある場合は、以下にメッセージを残してください。
以上がangular1 の学習ノート。angularjs でのビュー モデルの同期プロセスが含まれています。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 はじめに: 技術の継続的な発展により、音声認識技術は人工知能の分野の重要な部分になりました。 WebSocket と JavaScript をベースとしたオンライン音声認識システムは、低遅延、リアルタイム、クロスプラットフォームという特徴があり、広く使用されるソリューションとなっています。この記事では、WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法を紹介します。

WebSocketとJavaScript:リアルタイム監視システムを実現するためのキーテクノロジー はじめに: インターネット技術の急速な発展に伴い、リアルタイム監視システムは様々な分野で広く利用されています。リアルタイム監視を実現するための重要なテクノロジーの 1 つは、WebSocket と JavaScript の組み合わせです。この記事では、リアルタイム監視システムにおける WebSocket と JavaScript のアプリケーションを紹介し、コード例を示し、その実装原理を詳しく説明します。 1.WebSocketテクノロジー

JavaScript と WebSocket を使用してリアルタイム オンライン注文システムを実装する方法の紹介: インターネットの普及とテクノロジーの進歩に伴い、ますます多くのレストランがオンライン注文サービスを提供し始めています。リアルタイムのオンライン注文システムを実装するには、JavaScript と WebSocket テクノロジを使用できます。 WebSocket は、TCP プロトコルをベースとした全二重通信プロトコルで、クライアントとサーバー間のリアルタイム双方向通信を実現します。リアルタイムオンラインオーダーシステムにおいて、ユーザーが料理を選択して注文するとき

WebSocket と JavaScript を使用してオンライン予約システムを実装する方法 今日のデジタル時代では、ますます多くの企業やサービスがオンライン予約機能を提供する必要があります。効率的かつリアルタイムのオンライン予約システムを実装することが重要です。この記事では、WebSocket と JavaScript を使用してオンライン予約システムを実装する方法と、具体的なコード例を紹介します。 1. WebSocket とは何ですか? WebSocket は、単一の TCP 接続における全二重方式です。

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 はじめに: 今日、天気予報の精度は日常生活と意思決定にとって非常に重要です。テクノロジーの発展に伴い、リアルタイムで気象データを取得することで、より正確で信頼性の高い天気予報を提供できるようになりました。この記事では、JavaScript と WebSocket テクノロジを使用して効率的なリアルタイム天気予報システムを構築する方法を学びます。この記事では、具体的なコード例を通じて実装プロセスを説明します。私たちは

使用法: JavaScript では、insertBefore() メソッドを使用して、DOM ツリーに新しいノードを挿入します。このメソッドには、挿入される新しいノードと参照ノード (つまり、新しいノードが挿入されるノード) の 2 つのパラメータが必要です。

JavaScript チュートリアル: HTTP ステータス コードを取得する方法、特定のコード例が必要です 序文: Web 開発では、サーバーとのデータ対話が頻繁に発生します。サーバーと通信するとき、多くの場合、返された HTTP ステータス コードを取得して操作が成功したかどうかを判断し、さまざまなステータス コードに基づいて対応する処理を実行する必要があります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法を説明し、いくつかの実用的なコード例を示します。 XMLHttpRequestの使用

JavaScript は Web 開発で広く使用されているプログラミング言語であり、WebSocket はリアルタイム通信に使用されるネットワーク プロトコルです。 2 つの強力な機能を組み合わせることで、効率的なリアルタイム画像処理システムを構築できます。この記事では、JavaScript と WebSocket を使用してこのシステムを実装する方法と、具体的なコード例を紹介します。まず、リアルタイム画像処理システムの要件と目標を明確にする必要があります。リアルタイムの画像データを収集できるカメラ デバイスがあるとします。
