ホームページ ウェブフロントエンド jsチュートリアル angular.js で双方向バインディングを実装する方法についての簡単な説明 $watch $digest $apply_AngularJS

angular.js で双方向バインディングを実装する方法についての簡単な説明 $watch $digest $apply_AngularJS

May 16, 2016 pm 03:36 PM
angular apply watch

Angular.js の機能、双方向バインディング。

ビューの変更をデータに直接反映できる魔法の機能です。データの変更をリアルタイムでビューに通知します。

これは、次の 3 つの重要なスコープメソッドのおかげです:

$watch
$ダイジェスト
$apply

それらの違いを紹介しましょう:

$watch
これはスコープ上のデータをリッスンするリスナーです

メソッドの説明:

$scope.$watch('参数',function(newValue,oldValue){
 //逻辑处理
})
ログイン後にコピー

上記でリスナーを作成しました。
「パラメータ」は、$scope オブジェクトの下のオブジェクト (またはオブジェクトの属性) であり、

形式であることに注意してください。

$scope.name プロパティを監視するとします。

$scope.$watch('name',function(newValue,oldValue){
 //逻辑处理
})
ログイン後にコピー

上記のコードと同様、「name」には引用符が必要です

パラメータの後にコールバック関数が続きます。コールバック関数パラメータは、監視対象の属性、変更後の新しい値、および前回の変更前の古い値を返します。

$ダイジェスト

彼は、スコープ内のデータが変更されたかどうかをチェックする責任を負い、特定の属性が変更された場合、すぐにこの属性をリスナー ($watch によって登録されたリスナー) に通知し、リスナーをトリガーし、コールバック関数を実行します。 .

$apply

このメソッドは $digest に非常に似ており、$digest はスコープ内のすべてのデータをチェックします
$apply は rootScope 内のすべてのデータをチェックするのと同等で、親から子まですべてのデータをチェックします

$apply() == $rootScope.$digest()

$apply() メソッドには 2 つの形式があります。

最初の関数はパラメータとして関数を受け入れます。
これにより、$digest 関数がトリガーされ、パラメーター内の関数

が 1 回実行されます

2 番目のタイプはパラメータを受け入れません。
これは $digest の親から子へのサイクルをトリガーするだけです

Angular.js では、$digest は直接呼び出されず、代わりに $scope.$apply() が使用されます

モニターを設定していないのに、ビューとデータが双方向にバインドされるのはなぜですか

たとえば、テキスト ボックス ng-model="name"
このとき、実際には、上記のビューとの双方向バインディングに対応する属性名が $scope オブジェクトの下にあります

それを達成するにはどうすればよいですか?

実際、ng-model="name" または ng-bind="name" または {{name}} を定義するとき
この時点で、angular.js は $scope モデルの "name" 属性のリスナーを自動的に設定します:

$scope.$watch('name', function(newValue, oldValue) {
  //监听 name 属性的变化
});
ログイン後にコピー

angular.js がリスナーの自動作成に役立つことが判明したため、このプロパティと $scope.name データはリアルタイムで双方向にバインドされます。

もちろん、データが変更されていることがわかりますが、双方向バインディングは無効ですか?

いいえ

$scope モデルがダイジェスト ループを通過するときに、データがまだ返されていないだけです。

たとえば、メソッドを非同期で呼び出すと、callbac によって返されるデータ
たとえば、setTimeout でスケジュールされたトリガー関数を設定し、モデル データを変更します
つまり、$scope モデルのダイジェスト サイクルが失われ、その結果、モデルは新しいデータに従って更新するように UI に通知しませんでした。

このような問題が発生した場合はどうすればよいですか?

双方向バインディングを実現するには、ダイジェストを手動で呼び出してループ内のデータをチェックする必要があります

上で述べたように、通常はダイジェスト メソッドを直接呼び出さず、$apply メソッドを手動で呼び出して間接的に $digest ループをトリガーします。

次のように:

setTimeout(function() {
 $scope.name= '一介布衣';
 $scope.$apply();
}, 2000);
ログイン後にコピー

問題はここです。apply メソッドを手動で呼び出す必要があります

これまでのところ、angular.js は一部のディレクティブとサービスに対して $apply() メソッドを自動的に実装しています。

例: ng-click、ng-model、$timeout サービス、$http サービスなど

呼び出し後、angular.js は自動的に $apply() を呼び出し、双方向のデータ バインディングを実現します。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

ユーザーがまれに発生する不具合: Samsung Watch スマートウォッチで突然白い画面の問題が発生する ユーザーがまれに発生する不具合: Samsung Watch スマートウォッチで突然白い画面の問題が発生する Apr 03, 2024 am 08:13 AM

スマートフォンの画面に緑色の線が表示されるというトラブルに遭遇したことがある方もいると思いますし、見たことはなくても、関連する写真をインターネット上で見たことがあるはずです。では、スマートウォッチの画面が白くなってしまう状況に遭遇したことはありますか? CNMOは4月2日、海外メディアから、Redditユーザーがサムスンウォッチシリーズのスマートウォッチの画面が白くなっている写真をソーシャルプラットフォームで共有したことを知った。ユーザーは、「出発時に充電していましたが、戻ってきたらこのようになっていました。再起動しようとしましたが、再起動プロセス中も画面はまだこのままでした。」Samsung Watch スマートウォッチの画面が白くなりました。 Reddit ユーザーはスマート ウォッチを指定していません。特定のモデルです。しかし、写真から判断すると、Samsung Watch5のはずです。以前、別のRedditユーザーも報告しました

Ubuntu 24.04 に Angular をインストールする方法 Ubuntu 24.04 に Angular をインストールする方法 Mar 23, 2024 pm 12:20 PM

Angular.js は、動的アプリケーションを作成するための無料でアクセスできる JavaScript プラットフォームです。 HTML の構文をテンプレート言語として拡張することで、アプリケーションのさまざまな側面を迅速かつ明確に表現できます。 Angular.js は、コードの作成、更新、テストに役立つさまざまなツールを提供します。さらに、ルーティングやフォーム管理などの多くの機能も提供します。このガイドでは、Ubuntu24 に Angular をインストールする方法について説明します。まず、Node.js をインストールする必要があります。 Node.js は、ChromeV8 エンジンに基づく JavaScript 実行環境で、サーバー側で JavaScript コードを実行できます。ウブにいるために

Angular で Monaco エディターを使用する方法の簡単な分析 Angular で Monaco エディターを使用する方法の簡単な分析 Oct 17, 2022 pm 08:04 PM

Angularでモナコエディタを使用するにはどうすればよいですか?以下の記事は、最近業務で使用したangularでのmonaco-editorの使い方を記録したものですので、皆様のお役に立てれば幸いです。

Angular のサーバーサイド レンダリング (SSR) について説明する記事 Angular のサーバーサイド レンダリング (SSR) について説明する記事 Dec 27, 2022 pm 07:24 PM

Angular Universal をご存知ですか?これは、Web サイトがより優れた SEO サポートを提供するのに役立ちます。

プロジェクトが大きすぎる場合はどうすればよいですか? Angular プロジェクトを合理的に分割するにはどうすればよいでしょうか? プロジェクトが大きすぎる場合はどうすればよいですか? Angular プロジェクトを合理的に分割するにはどうすればよいでしょうか? Jul 26, 2022 pm 07:18 PM

Angular プロジェクトが大きすぎます。適切に分割するにはどうすればよいですか?次の記事では、Angular プロジェクトを合理的に分割する方法を紹介します。

vue3 データが watch/watchEffect を監視する方法 vue3 データが watch/watchEffect を監視する方法 May 12, 2023 pm 06:31 PM

リスナーの機能は、リアクティブ状態が変化するたびにトリガーされることは誰もが知っています。組み合わせた API では、watch() 関数と watchEffect() 関数を使用できます。リアクティブ状態を変更すると、次の時点でトリガーされる可能性があります。 Vue コンポーネントの更新とリスナー コールバックをトリガーします。デフォルトでは、ユーザー作成のリスナー コールバックは、Vue コンポーネントが更新される前に呼び出されます。これは、リスナー コールバックでアクセスする DOM が、Vue によって更新される前の状態になることを意味します。では、どうすればそれらをうまく活用できるのか見てみましょう。それらの違いは何ですか? watch() 関数 watch は、ref をリッスンするなど、特定のデータ ソースをリッスンする必要があります。watch の最初のパラメータは次のとおりです。

Angular の独立したコンポーネントの簡単な分析とその使用方法を説明します。 Angular の独立したコンポーネントの簡単な分析とその使用方法を説明します。 Jun 23, 2022 pm 03:49 PM

この記事では、Angular の独立コンポーネント、Angular で独立コンポーネントを作成する方法、および既存のモジュールを独立コンポーネントにインポートする方法について説明します。

フロントエンド開発に PHP と Angular を使用する方法 フロントエンド開発に PHP と Angular を使用する方法 May 11, 2023 pm 04:04 PM

インターネットの急速な発展に伴い、フロントエンド開発テクノロジーも常に改善され、反復されています。 PHP と Angular は、フロントエンド開発で広く使用されている 2 つのテクノロジーです。 PHP は、フォームの処理、動的ページの生成、アクセス許可の管理などのタスクを処理できるサーバー側スクリプト言語です。 Angular は、単一ページ アプリケーションの開発やコンポーネント化された Web アプリケーションの構築に使用できる JavaScript フレームワークです。この記事では、PHPとAngularをフロントエンド開発に使用する方法と、それらを組み合わせる方法を紹介します。

See all articles