[解決済み] AngularJSで$scope.$watchと$scope.$applyを使用するにはどうすればよいですか?
質問
の使い方がわかりません。
$scope.$watch
と
$scope.$apply
. 公式ドキュメントは参考にならない。
具体的にわからないこと
- DOMに接続されているのでしょうか?
- DOMの変更をモデルに反映させるには?
- 両者の接続ポイントは?
試してみた
このチュートリアル
を理解する必要があります。
$watch
と
$apply
を、当然といえば当然なのですが。
どのような
$apply
と
$watch
また、それらを適切に使用するにはどうしたらよいでしょうか?
どのように解決するのですか?
AngularJSを理解するためには、AngularJSの仕組みについて知っている必要があります。
ダイジェストサイクルと$scope
まず何よりも、AngularJSでは、いわゆる
ダイジェストサイクル
. このサイクルはループと考えることができ、その間AngularJSはすべての変数に変更があるかどうかをチェックします。
見る
すべての
$scope
s. ですから、もし
$scope.myVar
がコントローラに定義されており、この変数が
監視対象
の変更を監視するように暗黙のうちにAngularJSに伝えていることになります。
myVar
をループの各反復で使用します。
自然なフォローアップの質問でしょう。すべては
$scope
監視されている?幸いなことに、そうではありません。もし、あなたの
$scope
となると、ダイジェスト・ループの評価に時間がかかり、すぐにパフォーマンスの問題に直面することになります。そのため、AngularJSチームはいくつかの
$scope
変数が監視されていることを示します(下記参照)。
watch は、$scope の変更をリッスンするのに役立ちます。
を宣言する方法は2つあります。
$scope
変数が監視されていることを示します。
-
テンプレートで式を使って使用することで
<span>{{myVar}}</span>
-
を使用して手動で追加します。
$watch
サービス
広告 1)
これは最も一般的なシナリオで、あなたも見たことがあると思いますが、これがバックグラウンドで時計を作成していることを知りませんでしたか?そうです、そうでした。AngularJSのディレクティブを使うことで、(例えば
ng-repeat
) も暗黙のうちにウォッチを作成することができます。
広告 2)
このように、自分で作成した
時計
.
$watch
サービスは
$scope
が変更されました。めったに使われないが、時々役に立つ。例えば、'myVar' が変化するたびに何らかのコードを実行したい場合、以下のようにします。
function MyController($scope) {
$scope.myVar = 1;
$scope.$watch('myVar', function() {
alert('hey, myVar has changed!');
});
$scope.buttonClicked = function() {
$scope.myVar = 2; // This will trigger $watch expression to kick in
};
}
applyは、変更をダイジェストサイクルに統合することができます。
を考えることができます。
$apply
の機能は、統合メカニズムとして
. ご存知のように、ある部分を変更するたびに
に接続されたウォッチ変数が
$scope
オブジェクトに直接アクセスすると、AngularJSはその変更が起こったことを知ることができます。これは、AngularJSがそのような変更を監視することをすでに知っているからです。そのため、もしフレームワークによって管理されているコードで変更が発生した場合、ダイジェストサイクルは継続されます。
しかし、時には
AngularJSの世界の外で値を変更する。
で、その変更が正常に伝搬されることを確認します。
次のようなことを考えてみましょう。
$scope.myVar
の値を変更し、その値をjQueryの
$.ajax()
ハンドラです。これは将来のある時点で起こることです。AngularJSは、jQueryを待つように指示されていないので、これが起こるのを待つことはできません。
これに取り組むために
$apply
が導入されました。これは、消化サイクルを明示的に開始させるものです。しかし、これはデータをAngularJSに移行する(他のフレームワークと統合する)ためにのみ使うべきで、通常のAngularJSのコードと組み合わせてこのメソッドを使うことはできません。
これらはすべて、DOMとどのように関係しているのでしょうか?
さて、ここまで分かったら、もう一度チュートリアルに従ったほうがいいでしょう。ダイジェスト・サイクルは、UIとJavaScriptのコードが常に同期していることを確認するために、すべての
$scope
は、何も変化がない限り もしダイジェスト・ループの中でこれ以上変化が起こらなかったら、それは終了したとみなされます。
にオブジェクトをアタッチすることができます。
$scope
オブジェクトを明示的にコントローラで宣言するか、あるいは
{{expression}}
フォームを直接ビューで使用します。
さらに読む
関連
-
[解決済み] 方法 $state.go()
-
[解決済み] エラーです。[$injector:unpr] 不明なプロバイダです。ルートプロバイダ
-
[解決済み] AngularJS 。scope.apply()呼び出し時の$digest already in progressエラーを防ぐ。
-
[解決済み] AngularJSでデータバインディングはどのように機能するのですか?
-
[解決済み] AngularJSを使用して、ブラウザのコンソールで$scope変数にアクセスするにはどうすればよいですか?
-
[解決済み] AngularJS コントローラにおける 'this' と $scope の比較
-
[解決済み] 子コントローラから親スコープにアクセスするAngularJS
-
[解決済み】AngularJSのディレクティブスコープにおける「@」と「=」の違いは何ですか?
-
[解決済み】AngularJSのスコーププロトタイピング/プロトタイピング継承のニュアンスとは?
-
[解決済み】AngularJSでディレクティブを書くとき、新しいスコープ、新しい子スコープ、または新しい分離されたスコープが必要であるかどうかは、どのように決定するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] プリフライト応答が成功しない
-
[解決済み] Angular 1.2+ で ng-bind-html-unsafe を複製するために $sce.trustAsHtml(string) を使用するにはどうしたらよいですか?
-
[解決済み] Angular UI-Routerのマルチビュー
-
[解決済み] controllerAs "プロパティを使用する理由は何ですか?
-
[解決済み] ngInject'を本当に書く必要があるのか?
-
[解決済み] Angular.js: $evalの仕組みとバニラevalとの違いは何ですか?
-
[解決済み] Ui-srefがクリッカブルリンクを生成しない/動作しない
-
[解決済み] Angular JSによるシンプルなポップアップ
-
[解決済み] 複数の$scope属性を監視する
-
[解決済み] ng-repeat内のng-click関数にパラメータを追加しても、うまくいかないようです。