これは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 サイトの他の関連記事を参照してください。

さまざまなJavaScriptエンジンは、各エンジンの実装原則と最適化戦略が異なるため、JavaScriptコードを解析および実行するときに異なる効果をもたらします。 1。語彙分析:ソースコードを語彙ユニットに変換します。 2。文法分析:抽象的な構文ツリーを生成します。 3。最適化とコンパイル:JITコンパイラを介してマシンコードを生成します。 4。実行:マシンコードを実行します。 V8エンジンはインスタントコンピレーションと非表示クラスを通じて最適化され、Spidermonkeyはタイプ推論システムを使用して、同じコードで異なるパフォーマンスパフォーマンスをもたらします。

現実世界におけるJavaScriptのアプリケーションには、サーバー側のプログラミング、モバイルアプリケーション開発、モノのインターネット制御が含まれます。 2。モバイルアプリケーションの開発は、ReactNativeを通じて実行され、クロスプラットフォームの展開をサポートします。 3.ハードウェアの相互作用に適したJohnny-Fiveライブラリを介したIoTデバイス制御に使用されます。

私はあなたの日常的な技術ツールを使用して機能的なマルチテナントSaaSアプリケーション(EDTECHアプリ)を作成しましたが、あなたは同じことをすることができます。 まず、マルチテナントSaaSアプリケーションとは何ですか? マルチテナントSaaSアプリケーションを使用すると、Singの複数の顧客にサービスを提供できます

この記事では、許可によって保護されたバックエンドとのフロントエンド統合を示し、next.jsを使用して機能的なedtech SaaSアプリケーションを構築します。 FrontEndはユーザーのアクセス許可を取得してUIの可視性を制御し、APIリクエストがロールベースに付着することを保証します

JavaScriptは、現代のWeb開発のコア言語であり、その多様性と柔軟性に広く使用されています。 1)フロントエンド開発:DOM操作と最新のフレームワーク(React、Vue.JS、Angularなど)を通じて、動的なWebページとシングルページアプリケーションを構築します。 2)サーバー側の開発:node.jsは、非ブロッキングI/Oモデルを使用して、高い並行性とリアルタイムアプリケーションを処理します。 3)モバイルおよびデスクトップアプリケーション開発:クロスプラットフォーム開発は、反応および電子を通じて実現され、開発効率を向上させます。

JavaScriptの最新トレンドには、TypeScriptの台頭、最新のフレームワークとライブラリの人気、WebAssemblyの適用が含まれます。将来の見通しは、より強力なタイプシステム、サーバー側のJavaScriptの開発、人工知能と機械学習の拡大、およびIoTおよびEDGEコンピューティングの可能性をカバーしています。

JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

Pythonはデータサイエンスや機械学習により適していますが、JavaScriptはフロントエンドとフルスタックの開発により適しています。 1. Pythonは、簡潔な構文とリッチライブラリエコシステムで知られており、データ分析とWeb開発に適しています。 2。JavaScriptは、フロントエンド開発の中核です。 node.jsはサーバー側のプログラミングをサポートしており、フルスタック開発に適しています。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

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

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

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

WebStorm Mac版
便利なJavaScript開発ツール
