ホームページ ウェブフロントエンド jsチュートリアル Angularjs での $apply と最適化された使用について

Angularjs での $apply と最適化された使用について

Jul 02, 2018 pm 01:59 PM
angular angularjs apply 最適化

この記事では主に、Angularjs での $apply の最適化された使用方法について詳しく紹介します。必要な方は一緒に参照してください。

前書き

フロントエンドの全くの初心者である私にとって、JavaScript についてはまだ少しは知っていますが、Angular JS を直接使い始めようとすると、多くの抵抗に遭遇します。しかし、私は努力さえすれば、たとえ反人類的なデザインであっても大きな問題にはならないと信じています。

今日は、Angularjs の小さな星 $apply について話します。データが更新されてもビュー層が応答しないときは、apply を使用してくださいという声が常に聞こえます。その後、無知なので、割り当てコードの最後に $scope.$apply() を追加します。 . code> 、そして私はそれを知って嬉しい驚きを感じました。おお、本当に更新されました。 <p></p> <p>しかし、場合によっては、コンパイラーが容赦なく <code>$scope.$apply() ,然后就惊喜的发现。噢,真的更新了。

然而,有些时候,编译器会无情的给你返回

Error: $digest already in progress

那么,导致这些现象的原因时什么的呢?$apply究竟干了啥?听我慢慢到来。

一.$apply的作用

$apply()函数可以从Angular框架的外部让表达式在Angular上下文内部执行。

上面是AngularJs权威教程中的一句话。什么意思呢?

首先,你要清楚,在原生js或者第三方框架下,修改model,是有可能不会触发视图更新的,比如setTimeout、jquery插件。为什么?因为他们脱离了Angularjs的上下文,Angularjs并不能监听到数据的改变。看例子。

1.setTimeout

html:

<p>{{name}}</p>
ログイン後にコピー

js:

$scope.name="张三";
setTimeout(function(){
$scope.name = &#39;李四&#39;;
//$scope.$apply()
},500)
ログイン後にコピー

首先,name等于张三,500ms后,我把他赋值为李四,但是,页面上并没有改变,依然是张三。

而,我们把$scope.$apply()放开,就正常了,张三成功变为李四。

2.第三方插件

html:

<p>Date: <input type="text" id="datepicker"></p>
<p>
<header>所选日期</header>
{{selectedDate}}
</p>
ログイン後にコピー

js:

$scope.selectedDate = &#39;&#39;;
$( function() {
 $( "#datepicker" ).datepicker({
 onClose: function( selectedDate ) {
 $scope.selectedDate = selectedDate;
 // $scope.$apply();
 }
 });
} );
ログイン後にコピー

这是jquery的datepicker插件,当我们选定日期后,下面的日期应该随之显现,而现在却没有。这种情况就必须依靠$apply(),才能更新视图。

以上两种情况,都因为不处于Angularjs上下文中,导致监听不到数据的变化。而$apply究竟干了什么,才导致数据更新正常了呢?

其实$apply相当于一个触发器,它的作用就是触发digest循环,从而更新视图。

在digest是Angularjs的核心,是它实现了神奇的数据绑定。凡是触发事件,必会触发digest循环,比如,我们数值的ng事件,click啊,change,实际上都是触发了digest循环。

所以,我们所做的事,其实就是手动触发了digest循环。关于digest循环,属于题外话,这里不做过多介绍,想深入了解的同学,可以看看书籍,或者百度。

二.更好地运用digest循环

在Angularjs中,除了$apply可以触发digest循环外,还有其他的方法,也可以触发此循环。而且$apply往往时最坏的选择。下面推荐一些更好的选择。

1.$digest

$scope.$digest()

Error: $digest selected are in progress

というメッセージを返すことがあります。では、これらの現象の原因は何でしょうか? $apply は具体的に何をするのでしょうか?ゆっくり来るのを聞いてください。

1. $apply

$apply() 関数の役割は、Angular フレームワークの外側から Angular コンテキスト内で式を実行できます。

上記は、権威ある AngularJs チュートリアルからの文です。それはどういう意味ですか?

まず、ネイティブ JS またはサードパーティのフレームワーク (setTimeout や jquery プラグインなど) でモデルを変更しても、ビューの更新がトリガーされない可能性があることに注意する必要があります。なぜ?これらは Angularjs のコンテキストの外にあるため、Angularjs はデータの変更を監視できません。例を参照してください。

1.setTimeout

html:

$digest already in progress
ログイン後にコピー

js:

$timeout(function(){
$scope.name = &#39;李四&#39;;
},500)
ログイン後にコピー

まず、500ms後に彼をLi Siに割り当てましたが、ページは変わりません。何も変わっていません。Zhang San のままです。

🎜しかし、$scope.$apply() を解放すると、Zhang San は正常に Li Si に変わります。 🎜🎜🎜2. サードパーティのプラグイン🎜🎜🎜html:🎜🎜🎜
$scope.$evalAsync(
   function( $scope ) {
   console.log( "$evalAsync" );
   }
  );
ログイン後にコピー
🎜🎜🎜js:🎜🎜🎜rrreee🎜🎜🎜 日付を選択すると、次の日付が表示されます。が表示されますが、今はありません。この場合、ビューを更新するには $apply() に依存する必要があります。 🎜🎜上記 2 つのケースでは、Angularjs コンテキスト内にないため、データの変更を監視できません。そして、データが正常に更新されるようにするために $apply は正確に何をしたのでしょうか? 🎜🎜🎜実際、$apply はトリガーに相当し、その機能はビューを更新するダイジェスト ループをトリガーすることです。 🎜🎜🎜 Digest は Angularjs の中核であり、魔法のようなデータ バインディングを実装します。トリガーされるイベントは必ずダイジェスト サイクルをトリガーします。たとえば、数値イベントであるクリックと変更は、実際にダイジェスト サイクルをトリガーします。 🎜🎜そこで、私たちが行ったのは、実際にダイジェスト サイクルを手動でトリガーすることでした。ダイジェストサイクルについては余談ですが、詳しく知りたい学生は書籍や百度を読んでください。 🎜🎜🎜🎜2. ダイジェストループのより良い使用法🎜🎜🎜🎜 Angularjs では、ダイジェストループをトリガーできる $apply に加えて、このループをトリガーできる他のメソッドもあります。そして $apply は多くの場合最悪の選択です。いくつかのより良いオプションを以下に推奨します。 🎜🎜🎜1.$digest🎜🎜🎜$scope.$digest() は、親スコープの現在のスコープと子スコープの値のみを更新するため、$apply よりも高速です時間に関係なく。また、$apply は親スコープも評価する必要があるため、パフォーマンスが大幅に消費されます。 🎜🎜🎜2.$timeout🎜🎜🎜$timeout を使用して setTimeout を置き換えます。$timeout は Angularjs の組み込みサービスであり、もちろん Angularjs 環境により適しています。暗黙的にダイジェスト ループをトリガーし、前のダイジェスト ループが完了した次の瞬間にダイジェスト ループをトリガーするため、上記の 🎜🎜🎜rrreee🎜🎜🎜 が発生しません。 setTime $timeout にコードを入れてください🎜🎜🎜rrreee🎜🎜🎜 これで正常に動作します。面倒な適用はありません。 🎜🎜🎜3.$evalAsync🎜🎜🎜この方法が最も推奨されます。現在実行中のダイジェスト サイクルがある場合は、ダイジェスト サイクルを引き起こした操作を現在のダイジェスト サイクルに入れて実行します。 $timeout は、現在のダイジェスト サイクルが完了するまで待機してから、ダイジェスト サイクルを再度実行します。したがって、evalAsync はより高速に実行され、パフォーマンスが向上します。 $timeout のように呼び出すことができます。つまり、 🎜🎜🎜rrreee🎜🎜🎜 以上が今日言いたいことのすべてです。 Angularjs にはまだまだ多くの秘密やより良い使用法が隠されていますので、それらを深く研究し、より良い記事を共有していただければ幸いです。 🎜🎜🎜以下は実行可能コードです。探索できます: https://codepen.io/hanwolfxue/pen/yEZbYQ🎜🎜 上記はこの記事の全内容です。学習に役立つことを願っています。その他の関連コンテンツ PHP 中国語 Web サイトにご注意ください。 🎜🎜関連するおすすめ: 🎜

Angular4の組み込み命令の基本的な使い方について

angularJsでブラウザのキャッシュをクリアする方法

以上がAngularjs での $apply と最適化された使用についての詳細内容です。詳細については、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衣類リムーバー

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)

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 コンポーネントとその表示プロパティ: 非ブロックのデフォルト値について Angular コンポーネントとその表示プロパティ: 非ブロックのデフォルト値について Mar 15, 2024 pm 04:51 PM

Angular フレームワークのコンポーネントのデフォルトの表示動作は、ブロックレベルの要素ではありません。この設計の選択により、コンポーネント スタイルのカプセル化が促進され、開発者が各コンポーネントの表示方法を意識的に定義することが促進されます。 CSS プロパティの表示を明示的に設定することで、Angular コンポーネントの表示を完全に制御して、目的のレイアウトと応答性を実現できます。

詳細な解釈: なぜ Laravel はカタツムリのように遅いのでしょうか? 詳細な解釈: なぜ Laravel はカタツムリのように遅いのでしょうか? Mar 07, 2024 am 09:54 AM

Laravel は人気のある PHP 開発フレームワークですが、カタツムリのように遅いと批判されることがあります。 Laravel の速度が満足できない原因は一体何でしょうか?この記事では、Laravel がカタツムリのように遅い理由をさまざまな側面から詳細に説明し、読者がこの問題をより深く理解できるように、具体的なコード例と組み合わせて説明します。 1. ORM クエリのパフォーマンスの問題 Laravel では、ORM (オブジェクト リレーショナル マッピング) は非常に強力な機能です。

新しい Win11 コンピューターを受け取った後に設定を最適化し、パフォーマンスを向上させるにはどうすればよいですか? 新しい Win11 コンピューターを受け取った後に設定を最適化し、パフォーマンスを向上させるにはどうすればよいですか? Mar 03, 2024 pm 09:01 PM

新しいコンピュータを受け取った後、パフォーマンスをセットアップして最適化するにはどうすればよいですか? ユーザーは、[プライバシーとセキュリティ] を直接開き、[全般] (広告 ID、ローカル コンテンツ、アプリケーションの起動、推奨事項の設定、生産性向上ツール) をクリックするか、ローカル グループ ポリシーを直接開くことができます。新しい Win11 パソコンを受け取った後に、設定を最適化し、パフォーマンスを向上させる方法について詳しくご紹介します。 新しい Win11 パソコンを受け取った後に、設定を最適化し、パフォーマンスを向上させる方法について詳しくご紹介します。 1 つ: 1. [Win+i] ボタンを押します。 ] キーの組み合わせを押して設定を開き、左側の [プライバシーとセキュリティ] をクリックし、[右側のツールの Windows アクセス許可の下の一般 (広告 ID、ローカル コンテンツ、アプリの起動、設定の提案、生産性)] をクリックします。方法 2

Golang の GC 最適化戦略に関するディスカッション Golang の GC 最適化戦略に関するディスカッション Mar 06, 2024 pm 02:39 PM

Golang のガベージ コレクション (GC) は、開発者の間で常に話題になっています。高速プログラミング言語として、Golang の組み込みガベージ コレクターはメモリを適切に管理できますが、プログラムのサイズが大きくなるにつれて、パフォーマンスの問題が発生することがあります。この記事では、Golang の GC 最適化戦略を検討し、いくつかの具体的なコード例を示します。 Golang のガベージ コレクション Golang のガベージ コレクターは同時マークスイープ (concurrentmark-s) に基づいています。

C++ プログラムの最適化: 時間の複雑さを軽減する手法 C++ プログラムの最適化: 時間の複雑さを軽減する手法 Jun 01, 2024 am 11:19 AM

時間計算量は、入力のサイズに対するアルゴリズムの実行時間を測定します。 C++ プログラムの時間の複雑さを軽減するためのヒントには、適切なコンテナー (ベクター、リストなど) を選択して、データのストレージと管理を最適化することが含まれます。クイックソートなどの効率的なアルゴリズムを利用して計算時間を短縮します。複数の操作を排除して二重カウントを削減します。条件分岐を使用して、不必要な計算を回避します。二分探索などのより高速なアルゴリズムを使用して線形探索を最適化します。

Laravelのパフォーマンスボトルネックを解読:最適化テクニックを完全公開! Laravelのパフォーマンスボトルネックを解読:最適化テクニックを完全公開! Mar 06, 2024 pm 02:33 PM

Laravelのパフォーマンスボトルネックを解読:最適化テクニックを完全公開! Laravel は人気のある PHP フレームワークとして、開発者に豊富な機能と便利な開発エクスペリエンスを提供します。ただし、プロジェクトのサイズが大きくなり、訪問数が増加すると、パフォーマンスのボトルネックという課題に直面する可能性があります。この記事では、開発者が潜在的なパフォーマンスの問題を発見して解決できるように、Laravel のパフォーマンス最適化テクニックについて詳しく説明します。 1. Eloquent の遅延読み込みを使用したデータベース クエリの最適化 Eloquent を使用してデータベースにクエリを実行する場合は、次のことを避けてください。

Laravel パフォーマンスのボトルネックが明らかに: 最適化ソリューションが明らかに! Laravel パフォーマンスのボトルネックが明らかに: 最適化ソリューションが明らかに! Mar 07, 2024 pm 01:30 PM

Laravel パフォーマンスのボトルネックが明らかに: 最適化ソリューションが明らかに!インターネット技術の発展に伴い、Web サイトやアプリケーションのパフォーマンスの最適化がますます重要になってきています。人気の PHP フレームワークである Laravel は、開発プロセス中にパフォーマンスのボトルネックに直面する可能性があります。この記事では、Laravel アプリケーションが遭遇する可能性のあるパフォーマンスの問題を調査し、開発者がこれらの問題をより適切に解決できるように、いくつかの最適化ソリューションと具体的なコード例を提供します。 1. データベース クエリの最適化 データベース クエリは、Web アプリケーションにおける一般的なパフォーマンスのボトルネックの 1 つです。存在する

See all articles