検索
ホームページウェブフロントエンドjsチュートリアルangularJS_AngularJS の $apply() メソッドの詳細な説明

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

さて、これ以上ナンセンスはやめてください。 Angular JS とは何かを理解するために、Scope から始めました。では、スコープとは何でしょうか?公式文書から一節を借用:

コードをコピーします コードは次のとおりです:

「スコープはアプリケーション モデルを参照するオブジェクトです。これは式の実行コンテキストです。スコープはアプリケーションの DOM 構造を模倣する階層構造で配置されます。スコープは式を監視し、イベントを伝播できます。」

これを読んだ後、他のプログラミング言語に例えると、スコープはデータ モデルのスコープのようなもので、式の実行にコンテキストを提供するものだと感じました。今はこのように理解しましょう。

スコープの特徴

次に、Scope にはどのような機能があるのか​​見てみましょう。

Scope は、モデルの変更を監視するための $watch メソッドを提供します。
Scope は、モデルの変更を伝播するための $apply メソッドを提供します。
スコープを継承して、さまざまなアプリケーション コンポーネントとプロパティのアクセス許可を分離できます。
スコープは、式の評価のコンテキストを提供します。

この 4 つの機能について、私は ActionScript、C、Java を勉強したことがあるので、1 つ目、3 つ目、4 つ目は理解するのが難しくありませんが、2 つ目の点が少しわかりにくい気がします。答えを求めるという原則に従い、Google を通じていくつかの情報を見つけました。経験豊富なベテランの方は、レンガをタップしてください。

オリジン Javascript

まず、scope.apply() は一見すると、バインディングを更新するための普通のメソッドのように見えます。しかし、もう少し考えてみましょう。なぜそれが必要なのでしょうか?通常いつ使用されますか?これら 2 つの問題を理解するには、JavaScript から始める必要があります。 Javascript コードでは、コード フラグメントが実行される順番になると、ブラウザは現在のフラグメントのみを実行し、他には何も実行しません。そのため、あまりよくできていない Web ページでは、何かをクリックした後に停止してしまうことがあります。これは、JavaScript の動作方法がこの現象の原因の 1 つです。以下にそれを感じるためのコードを示します:

コードをコピーします コードは次のとおりです:

var button = document.getElementById('clickMe');
機能ボタンをクリックしました () {
alert('ボタンがクリックされました');
}
button.addEventListener('click', buttonClicked);
function timerComplete () {
alert('タイマー完了');
}
setTimeout(timerComplete, 5000);

Javascript コードをロードするときは、まず「clickMe」という ID を持つボタンを見つけて、次にリスナーを追加し、次にタイムアウトを設定します。 5 秒ほど待つと、ダイアログ ボックスが表示されます。ページを更新してすぐに clickMe ボタンをクリックすると、ダイアログ ボックスが表示されます。OK をクリックしないと、timerComplete 関数は実行されません。

バインディングを更新する方法

さて、一見関係のない話をした後、本題に戻りましょう。 Angular JS はデータが変更され、ページを更新する必要があることをどのようにして知るのでしょうか?コードはデータがいつ変更されたかを知る必要がありますが、現時点ではオブジェクト上のデータが変更されたことを直接通知する方法はありません (ECMAScript 5 はこの問題を解決しようとしていますが、まだ実験段階です)。現在主流となっている戦略には、次の 2 つのソリューションがあります。 1 つは、特別なオブジェクトを使用して、すべてのデータをプロパティを通じて直接指定するのではなく、オブジェクトのメソッドを呼び出すことによってのみ設定できるようにする方法です。このようにして、すべての変更を記録できるため、ページをいつ更新する必要があるかがわかります。この欠点は、特別なオブジェクトを継承しなければならないことです。割り当ては、object.key=value ではなく object.set('key', 'value') を通じてのみ行うことができます。 EmberJS や KnockoutJS などのフレームワークではこれを行います (ただし、私はこれにさらされたことがありません。恥ずかしいことです)。もう 1 つは、Angular JS で採用されている方法で、JavaScript コードの実行シーケンスごとにデータの変更があるかどうかをチェックします。これは非効率的であり、パフォーマンスに重大な影響を与える可能性もあります。ただし、Angular JS はこの問題を解決するためにいくつかの賢い方法を使用します (まだ研究されておらず、明確ではありません)。この利点は、任意のオブジェクトを自由に使用でき、代入方法に制限がなく、データの変更も検出できることです。
Angular JS で採用されているこのソリューションでは、データがいつ変更されるかが重要であり、ここでscope.apply() が役に立ちます。バインドされたデータが変更されたかどうかのチェックは、実際にはscope.digest()によって行われますが、このメソッドを直接呼び出すことはほとんどありませんが、scope.apply()メソッドのスコープ内で、スコープ.ダイジェスト()メソッド。 scope.apply() メソッドは関数または式を取得して実行し、最後にscope.digest() メソッドを呼び出してバインディングまたはウォッチャーを更新します。

$apply() を使用する場合

同じ質問ですが、いつ apply() メソッドを呼び出す必要があるのでしょうか?実際、ng-click、コントローラーの初期化、http コールバック関数など、ほとんどすべてのコードがscope.apply() でラップされている状況は非常にまれです。このような場合、自分で呼び出す必要はありません。実際、自分で呼び出すことはできません。そうしないと、 apply() メソッド内で apply() メソッドを呼び出すとエラーがスローされます。新しい実行シーケンスでコードを実行する必要がある場合、およびこの新しい実行シーケンスが Angular JS ライブラリ メソッドによって作成されない場合にのみ、これを使用する必要があります。現時点では、コードのスコープを使用する必要があります。 apply() がラップされました。例を使って説明しましょう:

コードをコピーします コードは次のとおりです:

{{メッセージ}}

コードをコピーします コードは次のとおりです:

functionCtrl($scope) {
$scope.message ="更新まで 2000 ミリ秒待っています"; setTimeout(function() {
$scope.message="タイムアウトが発生しました!";
// AngularJS は $scope
への更新を認識しません }、2000);
}

上記のコードが実行されると、ページに「更新を 2000 ミリ秒待機しています」と表示されます。どうやらデータの更新はangular JSによって認識されないようです。

次に、JavaScript コードを少し変更し、scope.apply() でラップします。

コードをコピーします コードは次のとおりです:
functionCtrl($scope) {
$scope.message ="更新まで 2000 ミリ秒待っています"; setTimeout(function() {
$scope.$apply(function() {
$scope.message="タイムアウトが発生しました!";
});
}、2000);
}

今回の違いは、ページに最初に「更新を 2000 ミリ秒待機しています」と表示され、2 秒待った後、コンテンツが「タイムアウトが呼び出されました!」に変更されることです。明らかに、データの更新は angular JS によって認識されます。
注: これを行うべきではありませんが、angular JS によって提供されるタイムアウト メソッドを使用して、apply メソッドで自動的にラップされるようにします。

科学は諸刃の剣です
最後に、scope.apply() メソッドとscope.apply(function) メソッドをもう一度見てみましょう。 angular JS は私たちに多くのことをもたらしてくれましたが、いくつかの機会も失いました。以下の疑似コードから一目でわかります:

コードをコピーします コードは次のとおりです:

function$apply(expr) {
{
を試してください return$eval(expr);
} catch(e) {
$ExceptionHandler(e);
} ついに {
$root.$digest();
}
}

すべての例外をキャッチし、再度スローしません。最後に、$digest() メソッドが呼び出されます。

要約すると

$apply() メソッドは、DOM イベント、setTimeout、XHR、またはその他のサードパーティ ライブラリなど、Angular フレームワークの外側で Angular JS 式を実行できます。これはほんの始まりにすぎません。水はまだ非常に深いです。皆さんも一緒に深く潜ってください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
Python vs. JavaScript:開発者の比較分析Python vs. JavaScript:開発者の比較分析May 09, 2025 am 12:22 AM

PythonとJavaScriptの主な違いは、タイプシステムとアプリケーションシナリオです。 1。Pythonは、科学的コンピューティングとデータ分析に適した動的タイプを使用します。 2。JavaScriptは弱いタイプを採用し、フロントエンドとフルスタックの開発で広く使用されています。この2つは、非同期プログラミングとパフォーマンスの最適化に独自の利点があり、選択する際にプロジェクトの要件に従って決定する必要があります。

Python vs. JavaScript:ジョブに適したツールを選択するPython vs. JavaScript:ジョブに適したツールを選択するMay 08, 2025 am 12:10 AM

PythonまたはJavaScriptを選択するかどうかは、プロジェクトの種類によって異なります。1)データサイエンスおよび自動化タスクのPythonを選択します。 2)フロントエンドとフルスタック開発のためにJavaScriptを選択します。 Pythonは、データ処理と自動化における強力なライブラリに好まれていますが、JavaScriptはWebインタラクションとフルスタック開発の利点に不可欠です。

PythonとJavaScript:それぞれの強みを理解するPythonとJavaScript:それぞれの強みを理解するMay 06, 2025 am 12:15 AM

PythonとJavaScriptにはそれぞれ独自の利点があり、選択はプロジェクトのニーズと個人的な好みに依存します。 1. Pythonは、データサイエンスやバックエンド開発に適した簡潔な構文を備えた学習が簡単ですが、実行速度が遅くなっています。 2。JavaScriptはフロントエンド開発のいたるところにあり、強力な非同期プログラミング機能を備えています。 node.jsはフルスタックの開発に適していますが、構文は複雑でエラーが発生しやすい場合があります。

JavaScriptのコア:CまたはCの上に構築されていますか?JavaScriptのコア:CまたはCの上に構築されていますか?May 05, 2025 am 12:07 AM

javascriptisnotbuiltoncorc;それは、解釈されていることを解釈しました。

JavaScriptアプリケーション:フロントエンドからバックエンドまでJavaScriptアプリケーション:フロントエンドからバックエンドまでMay 04, 2025 am 12:12 AM

JavaScriptは、フロントエンドおよびバックエンド開発に使用できます。フロントエンドは、DOM操作を介してユーザーエクスペリエンスを強化し、バックエンドはnode.jsを介してサーバータスクを処理することを処理します。 1.フロントエンドの例:Webページテキストのコンテンツを変更します。 2。バックエンドの例:node.jsサーバーを作成します。

Python vs. Javascript:どの言語を学ぶべきですか?Python vs. Javascript:どの言語を学ぶべきですか?May 03, 2025 am 12:10 AM

PythonまたはJavaScriptの選択は、キャリア開発、学習曲線、エコシステムに基づいている必要があります。1)キャリア開発:Pythonはデータサイエンスとバックエンド開発に適していますが、JavaScriptはフロントエンドおよびフルスタック開発に適しています。 2)学習曲線:Python構文は簡潔で初心者に適しています。 JavaScriptの構文は柔軟です。 3)エコシステム:Pythonには豊富な科学コンピューティングライブラリがあり、JavaScriptには強力なフロントエンドフレームワークがあります。

JavaScriptフレームワーク:最新のWeb開発のパワーJavaScriptフレームワーク:最新のWeb開発のパワーMay 02, 2025 am 12:04 AM

JavaScriptフレームワークのパワーは、開発を簡素化し、ユーザーエクスペリエンスとアプリケーションのパフォーマンスを向上させることにあります。フレームワークを選択するときは、次のことを検討してください。1。プロジェクトのサイズと複雑さ、2。チームエクスペリエンス、3。エコシステムとコミュニティサポート。

JavaScript、C、およびブラウザの関係JavaScript、C、およびブラウザの関係May 01, 2025 am 12:06 AM

はじめに私はあなたがそれを奇妙に思うかもしれないことを知っています、JavaScript、C、およびブラウザは正確に何をしなければなりませんか?彼らは無関係であるように見えますが、実際、彼らは現代のウェブ開発において非常に重要な役割を果たしています。今日は、これら3つの間の密接なつながりについて説明します。この記事を通して、JavaScriptがブラウザでどのように実行されるか、ブラウザエンジンでのCの役割、およびそれらが協力してWebページのレンダリングと相互作用を駆動する方法を学びます。私たちは皆、JavaScriptとブラウザの関係を知っています。 JavaScriptは、フロントエンド開発のコア言語です。ブラウザで直接実行され、Webページが鮮明で興味深いものになります。なぜJavascrを疑問に思ったことがありますか

See all articles

ホット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 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

SublimeText3 中国語版

SublimeText3 中国語版

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

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!