目次
のコードを見てみましょう。
監視配列の最初の要素
が配列全体の古い値と新しい値になることに注目する価値があります。したがって、実際に何が変化するかを理解するには、それらを互いに比較する必要があります。
アレイ内の要素を監視するよりも便利な場合、オブジェクトの任意のフィールドを監視できます。しかし、それは驚くことではありませんよね?結局のところ、javaScriptの配列
$scope.$watchGroupそれは本当に違うアプローチですか?答えはノーです、そうではありません。
関数は、主に変数または式の値の変化を観察するために使用されます。これは、変数または式の値の変化を監視するためのAngularJSスコープされたオブジェクトの一部です。変更が検出されると、$watch関数は、監視された変数が変更されるたびに実行されるコールバック関数をトリガーします。
関数は、式のセットを監視するために使用されます。これは$watchGroup関数のように機能しますが、複数の監視された式が変更された場合でも、ダイジェストサイクルごとに1回のみコールバック関数をトリガーします。これにより、複数の式を監視するとパフォーマンスが向上します。
または$watchの使用を検討するか、監視された変数の数を制限します。
ホームページ ウェブフロントエンド jsチュートリアル Angularjsで$ watchをマスターします

Angularjsで$ watchをマスターします

Feb 18, 2025 am 10:47 AM

Mastering $watch in AngularJS

コアポイント

  • AngularJSの$watch関数は、可変値または式の変化を観察するための強力なツールです。変更が検出されると、監視された変数が変更されるたびに実行されるコールバック関数をトリガーします。
  • $watch比較のためにJavaScriptの平等演算子(===)を使用します。新しい値が古い値と異なる場合、コールバック関数がトリガーされます。ただし、デフォルトでは、$watchは参照等式のみをチェックすることに注意する必要があります。つまり、コールバック関数は、監視された変数に新しい値が割り当てられている場合にのみトリガーされます。
  • AngularJSは、それぞれ同じコールバック関数を持つ複数のモニターまたは監視配列またはオブジェクトをセットアップするための便利なショートカットとして$watchGroupおよび$watchCollectionを提供します。ただし、これらの方法は浅い監視のみを実行し、参照の変更にのみ反応します。
  • 特に複数の変数で
  • を使用すると、すべての監視された変数の変更を各要約サイクルについてチェックする必要があるため、パフォーマンスに影響を与える可能性があります。開発者は、状況に応じて$watchまたは$watchGroupの使用を検討するか、監視された変数の数を制限してパフォーマンスを改善する必要があります。 $watchCollection

この記事はマーク・ブラウンによってレビューされました。 SetePointコンテンツを最高に獲得してくれたSetePointのすべてのピアレビューアに感謝します! AngularJSは、3つの異なる「監視」メソッドを使用して、パブリッシュサブスクライブモードを使用するためのさまざまなオプションを提供します。各メソッドは、その動作を変更するためにオプションのパラメーターを使用します。

に関する公式の文書は、網羅的なものとはほど遠いものです。結局のところ、これはAngularjs V1全体を悩ませる問題です。進行方法を説明するオンラインリソースでさえ、せいぜい断片化されています。

したがって、最終的には、開発者が特定の状況に適したアプローチを選択することは困難です。これは、Angularjsの初心者に特に当てはまります!結果は驚くべきか予測不可能である可能性があり、必然的にエラーにつながります。 $watch この記事では、AngularJSの概念に精通していると仮定します。レビューする必要があると思われる場合は、

、バインディング、

および

について読む必要がある場合があります。

$scope$applyあなたの理解を確認してください$digest

たとえば、アレイの最初の要素を監視する最良の方法は何ですか?スコープで配列を宣言するとします

  • 配列に要素を追加すると、コールバック関数をトリガーしますか? $scope.$watch('letters', function () {...});
  • 最初の要素を変更すると、発砲しますか?
  • はどこですか?それは同じように機能しますか、それともより良いですか? $scope.$watch('letters[0]', function () {...}); 上記の上記、配列要素は元の値です。最初の要素を同じ値に置き換えた場合はどうなりますか?
  • 次に、配列にオブジェクトが含まれていると仮定します。何が起こるのですか?
  • $watchの違いは何ですか? $watchCollection $watchGroup
  • これらすべての質問に混乱している場合は、読み続けてください。私の目標は、いくつかの例を使用して、できるだけ明確に説明することで、プロセスを説明することです。

$scope.$watch

から始めましょう。すべての時計機能のコアは次のとおりです。私たちが見る他のすべての方法は、

の便利なショートカットです。 $scope.$watch $watch

を使用します $watch Angularの利点は、同じメカニズムを明示的に使用して、コントローラーのデータ変更によってトリガーされる複雑な操作を実行できることです。たとえば、以下に応じて変更できる特定のデータのモニターをセットアップできます。

タイムアウト

    ui
  1. Webワーカーによって実行される複雑な非同期計算
  2. ajax call
  3. 原因が何であれ、データの変更を処理するために1つのリスナーのみを設定できます。
しかし、これを行うには、

自分で電話する必要があります。

実用操作$scope.$watch

のコードを見てみましょう。

これはその署名です:$rootscope.watch()

詳細には、その4つのパラメーター:function(watchExp, listener, objectEquality, prettyPrintExpression)

    監視された式。それは関数または文字列である可能性があり、すべてのダイジェストサイクルで評価されます。
  1. ここで注意すべき重要な側面は、watchExp

    式が関数として評価されている場合、関数は等である必要があることです。言い換えれば、同じ入力セットについては、常に同じ出力を返す必要があります。そうでない場合、Angularは監視されたデータが変更されたと仮定します。これは、違いを検出し続け、ダイジェストサイクルの各反復でリスナーを呼び出すことを意味します。

  2. モニターが最初にセットアップされたときに起動されるコールバック関数、そして要約サイクル中に
  3. 値の変更が検出されるたびに。設定時の最初の呼び出しは、式の初期値を保存することを目的としています。

    listener watchExp

  4. この値が真である場合にのみ、モニターは深度比較を実行します。それ以外の場合、浅い比較、つまり比較参照のみを実行します。
  5. 例として配列を取りましょう objectEquality

    は、

    フィールドの再割り当てのみがリスナーを呼び出されることを意味します。 $scope.fruit = ["banana", "apple"]また、「深い」深さがどれほど深いかを確認する必要があります。これについては後で説明します。

  6. 渡された場合、監視式をオーバーライドします。このパラメーターは、prettyPrintExpressionの通常の呼び出しで使用することを意図していません。 $watch()

    注意:あなた自身が見ることができるように、4番目のパラメーターが誤って渡された場合、予期しない結果は予期しない結果になりやすいです。

今度は、紹介の質問のいくつかに答えます。このセクションの例をご覧ください:

CODEPEN例

行動の違いを直接比較することができます。

監視配列

では、スコープ上の配列を監視して変更を加える必要がありますが、「変更」とはどういう意味ですか?

コントローラーが次のように見えるとします:

app.controller('watchDemoCtrl', ['$scope', function($scope){
    $scope.letters = ['A','B','C'];
}]);
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
1つのオプションは、次のような呼び出しを使用することです。

上記のコールバックでは、

および
$scope.$watch('letters', function (newValue, oldValue, scope) {
    // 对 $scope.letters 执行任何操作
});
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
が自明の意味を持ち、

サイクルがそれを呼び出すたびに更新されます。現在の範囲への参照を保持しているため、newValueの意味も直感的です。 oldValue $digestしかし、キーは次のとおりです。このリスナーはいつ呼び出されますか?実際、何も起こらずに配列内の要素を追加、削除、交換することができます。これは、デフォルトでは、scope

参照等式

のみが必要であると想定しているため、コールバック関数は新しい値をlettersに割り当てるときにのみトリガーされるためです。 $watch 配列の任意の要素の変更に対してアクションを実行する必要がある場合は、3番目のパラメーターとして(つまり、上記のオプション$scope.lettersパラメーターの値として)を渡す必要があります。

trueサーベイランスオブジェクトwatch objectEqualityオブジェクトの場合、状況は変わりません。

がfalseの場合、そのスコープ変数への再割り当てを監視するだけで、Trueの場合、オブジェクトの要素が変更されるたびにコールバック関数がトリガーされます。
$scope.$watch('letters', function (newValue, oldValue, scope) {
    // 对 $scope.letters 执行任何操作
}, true);
ログイン後にコピー
ログイン後にコピー

監視配列の最初の要素

objectEqualityを使用して配列を監視することにより、コールバック関数がトリガーされるたびに、

および

が配列全体の古い値と新しい値になることに注目する価値があります。したがって、実際に何が変化するかを理解するには、それらを互いに比較する必要があります。

アレイの最初の要素(または4番目の要素 - 同じ原理)の変更にのみ興味があるとします。 Angularは優れているため、これを行うことができます。最初の議論としてobjectEquality === trueに渡された表現で自然な方法でそれを表現することができます:newValue oldValue

配列に2つの要素しかない場合はどうなりますか?問題ありません。4番目の要素を追加しない限り、コールバック関数は起動しません。 OK OK、技術的には、モニターをセットアップしたときに発射し、次に4番目の要素を追加したときにのみ発生します。

oldValueを記録すると、どちらの場合も未定義になることがわかります。これを既存の要素を監視するときに起こることと比較してください。セットアップの場合でも、oldValue == undefinedがあります。したがって、$watch処理できません!

もっと興味深い質問:ここで合格する必要がありますか? objectEquality === true

短い答え:申し訳ありませんが、短い答えはありません。

それは本当に依存しています:

この例では、元の値に取り組んでいるため、深さの比較は必要ありません。そのため、
    を省略できます。
  • objectEqualityしかし、たとえば
  • など、マトリックスがあるとします。その後、
  • のような割り当てが変更されたら、アラートを取得することをお勧めします。 $scope.board = [[1, 2, 3], [4, 5, 6]] $scope.board[0][1] = 7 オブジェクトの監視フィールド

アレイ内の要素を監視するよりも便利な場合、オブジェクトの任意のフィールドを監視できます。しかし、それは驚くことではありませんよね?結局のところ、javaScriptの配列

オブジェクトです。

深さはどれくらいですか?
app.controller('watchDemoCtrl', ['$scope', function($scope){
    $scope.letters = ['A','B','C'];
}]);
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
この時点では、最後に重要な詳細を明確にする必要があります。各フィールドが非プリミティブ値である複雑なネストされたオブジェクトを監視する必要がある場合はどうなりますか?たとえば、ツリーまたはグラフ、またはJSONデータのみ。

チェックしましょう!

まず、監視するオブジェクトが必要です:

オブジェクト全体のモニターをセットアップしましょう。これまでのところ、この場合

$scope.$watch('letters', function (newValue, oldValue, scope) {
    // 对 $scope.letters 执行任何操作
});
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
に設定する必要があることは明らかだと思います。

objectEquality true問題は次のとおりです。

のような割り当てが発生した場合、Angularは私たちに知らせるのに十分親切ですか?
$scope.$watch('letters', function (newValue, oldValue, scope) {
    // 对 $scope.letters 执行任何操作
}, true);
ログイン後にコピー
ログイン後にコピー

答えは次のとおりです。はい、幸運なことに、それは(以前のCodepenデモで参照してください)。 $scope.b.bb[1].bb2a = 7;

その他の方法

$scope.$watchGroupそれは本当に違うアプローチですか?答えはノーです、そうではありません。

$watchGroup()は、同じコールバック関数を使用して複数のモニターをセットアップし、

の配列を渡すことができる便利なショートカットです。

$watchGroup()各渡された式は、標準watchExpressionsメソッドを使用して監視されます。

$scope.$watch()

$scope.$watch('letters[4]', function (newValue, oldValue, scope) {
    //...
}, true);
ログイン後にコピー

を使用すると、変更された値や同じ値を保持している値を含む、式の値のリストを保存することに注意する価値があります。最初のパラメーターでそれらの順序は、配列を渡す順序が同じです。 $watchGroup この方法のドキュメントをチェックした場合、newValuesオプションを取得しないことに気付く場合があります。これは、表現を浅く監視し、参照の変更にのみ反応するためです。 oldValues

以下の$watchGroup()デモを使用する場合、いくつかの微妙さに驚くかもしれません。たとえば、unshiftは、少なくともある程度までリスナーを呼び出されます。これは、式リストを$watchGroupに渡すと、が実行コールバック関数をもたらす式をトリガーするためです。

CODEPEN例 また、

のサブフィールドへの変更は更新を作成しないことに注意してください。更新は、新しい値がBフィールド自体に割り当てられている場合にのみ生成されます。

$scope.obj.b

$scope.$watchCollectionこれは、配列またはオブジェクトを監視するためのもう1つの便利なショートカットです。配列の場合、リスナーは、任意の要素が交換、削除、または追加されたときに呼び出されます。オブジェクトの場合、プロパティが変更された場合。繰り返しになりますが、

を許可しないため、要素/フィールドを浅く監視するだけで、サブフィールドの変化に反応しません。 $watchCollection() objectEquality

CODEPEN例

結論

これらの例が、この角度のある機能の力を発見し、適切なオプションを使用することがどれほど重要かを理解するのに役立つことを願っています。

CodePenをコピーして、これらのメソッドをさまざまなコンテキストで使用してみてください。コメントセクションにフィードバックを残すことを忘れないでください。

この記事で説明した概念のいくつかをもっと詳しく見たい場合は、さらに読むためのいくつかの提案があります。

angularjs scope

    Angular's
  1. および
  2. を理解してください JavaScriptイベント処理における新しいパターン$apply() AngularJSスコープ$digest()のプロトタイプ継承
  3. などのドキュメント
  4. faq(faq)$watch
  5. ingularjs

$watchAngularjsの主な目的は何ですか?

AngularJSの

関数は、主に変数または式の値の変化を観察するために使用されます。これは、変数または式の値の変化を監視するためのAngularJSスコープされたオブジェクトの一部です。変更が検出されると、$watch関数は、監視された変数が変更されるたびに実行されるコールバック関数をトリガーします。

$watchどのように機能しますか? $watch AngularJSの

関数は、監視された変数または式の古い値と新しい値を比較することにより機能します。比較のためにJavaScriptの平等演算子(===)を使用します。新しい値が古い値と異なる場合、

関数はコールバック関数をトリガーします。 $watch

angularjsで

を使用するにはどうすればよいですか? $watch $watch angularjsで

を使用するには、スコープオブジェクトの

メソッドを呼び出して、監視する変数または式の名前、および監視されている変数がコールバックを監視するときに発生する2つのパラメーターを渡す必要があります。変更時に実行される機能。例は次のとおりです。$watch
app.controller('watchDemoCtrl', ['$scope', function($scope){
    $scope.letters = ['A','B','C'];
}]);
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
Angularjsの

$watchの違いは何ですか? $apply AngularJSの

関数は変数または式の変化を観察するために使用され、関数は使用されます。それに応じて。通常、$watch関数は、domイベントハンドラーや$apply関数など、Angularjsコンテキストの外側のモデル変更を行うときに使用されます。 $apply setTimeout

を使用してAngularjsの複数の変数を監視できますか?

$watchはい、

を使用して、AngularJSの複数の変数を監視できます。これを行うには、変数名の配列を

関数に渡すことができます。ただし、各ダイジェストサイクルのすべての監視された変数の変更を確認する必要があるため、複数の変数の監視がパフォーマンスに影響を与える可能性があることを忘れないでください。 $watch $watchangularjsの変数の監視を停止するにはどうすればよいですか? $watch

angularjsの

関数を呼び出すと、ログアウト関数が返されます。この関数を呼び出して、監視変数を停止できます。例は次のとおりです。$watch

angularjsの$watchとは何ですか?

$scope.$watch('letters', function (newValue, oldValue, scope) {
    // 对 $scope.letters 执行任何操作
});
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
angularjsの

関数は、式のセットを監視するために使用されます。これは$watchGroup関数のように機能しますが、複数の監視された式が変更された場合でも、ダイジェストサイクルごとに1回のみコールバック関数をトリガーします。これにより、複数の式を監視するとパフォーマンスが向上します。

angularjsの$watchGroupとは何ですか? $watch AngularJSの

関数は、アレイのオブジェクトまたは要素の属性を監視するために使用されます。属性や要素が変更される限り、コールバック関数をトリガーしますが、

とは異なり、パフォーマンスを改善できるオブジェクトや配列を深く監視しません。 $watchCollection

angularjsディレクティブで

を使用できますか? $watchCollection $watchはい、AngularJSディレクティブで

を使用できます。実際、ディレクティブで

を使用して、属性またはスコープ変数の変数の変更に応答することが一般的です。 $watch

angularjsのパフォーマンスに関する考慮事項は、

を使用していますか? $watch AngularJで$watch

を使用すると、特に多くの変数や式を監視する場合は、パフォーマンスに影響を与える可能性があります。これは、各ダイジェストサイクルのすべての監視された変数の変更を確認する必要があるためです。パフォーマンスを向上させるには、状況に応じて

または$watchの使用を検討するか、監視された変数の数を制限します。

以上がAngularjsで$ watchをマスターしますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Python vs. JavaScript:学習曲線と使いやすさ Python vs. JavaScript:学習曲線と使いやすさ Apr 16, 2025 am 12:12 AM

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

JavaScriptとWeb:コア機能とユースケース JavaScriptとWeb:コア機能とユースケース Apr 18, 2025 am 12:19 AM

Web開発におけるJavaScriptの主な用途には、クライアントの相互作用、フォーム検証、非同期通信が含まれます。 1)DOM操作による動的なコンテンツの更新とユーザーインタラクション。 2)ユーザーエクスペリエンスを改善するためにデータを提出する前に、クライアントの検証が実行されます。 3)サーバーとのリフレッシュレス通信は、AJAXテクノロジーを通じて達成されます。

JavaScript in Action:実際の例とプロジェクト JavaScript in Action:実際の例とプロジェクト Apr 19, 2025 am 12:13 AM

現実世界でのJavaScriptのアプリケーションには、フロントエンドとバックエンドの開発が含まれます。 1)DOM操作とイベント処理を含むTODOリストアプリケーションを構築して、フロントエンドアプリケーションを表示します。 2)node.jsを介してRestfulapiを構築し、バックエンドアプリケーションをデモンストレーションします。

JavaScriptエンジンの理解:実装の詳細 JavaScriptエンジンの理解:実装の詳細 Apr 17, 2025 am 12:05 AM

JavaScriptエンジンが内部的にどのように機能するかを理解することは、開発者にとってより効率的なコードの作成とパフォーマンスのボトルネックと最適化戦略の理解に役立つためです。 1)エンジンのワークフローには、3つの段階が含まれます。解析、コンパイル、実行。 2)実行プロセス中、エンジンはインラインキャッシュや非表示クラスなどの動的最適化を実行します。 3)ベストプラクティスには、グローバル変数の避け、ループの最適化、constとletsの使用、閉鎖の過度の使用の回避が含まれます。

Python vs. JavaScript:コミュニティ、ライブラリ、リソース Python vs. JavaScript:コミュニティ、ライブラリ、リソース Apr 15, 2025 am 12:16 AM

PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

Python vs. JavaScript:開発環境とツール Python vs. JavaScript:開発環境とツール Apr 26, 2025 am 12:09 AM

開発環境におけるPythonとJavaScriptの両方の選択が重要です。 1)Pythonの開発環境には、Pycharm、Jupyternotebook、Anacondaが含まれます。これらは、データサイエンスと迅速なプロトタイピングに適しています。 2)JavaScriptの開発環境には、フロントエンドおよびバックエンド開発に適したnode.js、vscode、およびwebpackが含まれます。プロジェクトのニーズに応じて適切なツールを選択すると、開発効率とプロジェクトの成功率が向上する可能性があります。

JavaScript通訳者とコンパイラにおけるC/Cの役割 JavaScript通訳者とコンパイラにおけるC/Cの役割 Apr 20, 2025 am 12:01 AM

CとCは、主に通訳者とJITコンパイラを実装するために使用されるJavaScriptエンジンで重要な役割を果たします。 1)cは、JavaScriptソースコードを解析し、抽象的な構文ツリーを生成するために使用されます。 2)Cは、Bytecodeの生成と実行を担当します。 3)Cは、JITコンパイラを実装し、実行時にホットスポットコードを最適化およびコンパイルし、JavaScriptの実行効率を大幅に改善します。

Webサイトからアプリまで:JavaScriptの多様なアプリケーション Webサイトからアプリまで:JavaScriptの多様なアプリケーション Apr 22, 2025 am 12:02 AM

JavaScriptは、Webサイト、モバイルアプリケーション、デスクトップアプリケーション、サーバー側のプログラミングで広く使用されています。 1)Webサイト開発では、JavaScriptはHTMLおよびCSSと一緒にDOMを運用して、JQueryやReactなどのフレームワークをサポートします。 2)ReactNativeおよびIonicを通じて、JavaScriptはクロスプラットフォームモバイルアプリケーションを開発するために使用されます。 3)電子フレームワークにより、JavaScriptはデスクトップアプリケーションを構築できます。 4)node.jsを使用すると、JavaScriptがサーバー側で実行され、高い並行リクエストをサポートします。

See all articles