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

angularJS_AngularJS の $apply() メソッドの詳細な説明

May 16, 2016 pm 04:21 PM
angularjs

フロントエンドのまったくの初心者である私にとって、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 までご連絡ください。

ホット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)

入門から習得まで、2022 年の最新 5 つの angularjs チュートリアル 入門から習得まで、2022 年の最新 5 つの angularjs チュートリアル Jun 15, 2017 pm 05:50 PM

Javascript は、コードの構成、コードのプログラミング パラダイム、およびオブジェクト指向理論の点で非常にユニークな言語です。しかし、JavaScript が 20 年間主流であったとはいえ、jQuery、Angularjs、さらには React などの人気のあるフレームワークを理解したい場合は、「Black Horse Cloud Classroom JavaScript Advanced Framework」を見てください。デザインビデオチュートリアル」。

PHP と AngularJS を使用して応答性の高い Web サイトを構築し、高品質のユーザー エクスペリエンスを提供します PHP と AngularJS を使用して応答性の高い Web サイトを構築し、高品質のユーザー エクスペリエンスを提供します Jun 27, 2023 pm 07:37 PM

今日の情報化時代において、ウェブサイトは人々が情報を入手し、コミュニケーションを図るための重要なツールとなっています。レスポンシブな Web サイトはさまざまなデバイスに適応し、ユーザーに高品質のエクスペリエンスを提供できます。これは、現代の Web サイト開発のホットスポットとなっています。この記事では、PHP と AngularJS を使用して応答性の高い Web サイトを構築し、高品質のユーザー エクスペリエンスを提供する方法を紹介します。 PHP の概要 PHP は、Web 開発に最適なオープンソースのサーバー側プログラミング言語です。 PHP には、学びやすさ、クロスプラットフォーム、豊富なツール ライブラリ、開発効率など、多くの利点があります。

PHP と AngularJS を使用して Web アプリケーションを構築する PHP と AngularJS を使用して Web アプリケーションを構築する May 27, 2023 pm 08:10 PM

インターネットの継続的な発展に伴い、Web アプリケーションは企業情報構築の重要な部分となり、最新化作業に必要な手段となりました。 Web アプリケーションの開発、保守、拡張を容易にするために、開発者は開発ニーズに合った技術フレームワークとプログラミング言語を選択する必要があります。 PHP と AngularJS は非常に人気のある 2 つの Web 開発テクノロジであり、それぞれサーバー側とクライアント側のソリューションであり、これらを組み合わせて使用​​すると、Web アプリケーションの開発効率とユーザー エクスペリエンスを大幅に向上させることができます。 PHPPHPの利点

Flask と AngularJS を使用してシングルページ Web アプリケーションを構築する Flask と AngularJS を使用してシングルページ Web アプリケーションを構築する Jun 17, 2023 am 08:49 AM

Web テクノロジーの急速な発展に伴い、シングル ページ Web アプリケーション (SinglePage Application、SPA) は、Web アプリケーション モデルとしてますます人気が高まっています。従来の複数ページの Web アプリケーションと比較して、SPA の最大の利点は、ユーザー エクスペリエンスがよりスムーズであり、サーバーのコンピューティング負荷も大幅に軽減されることです。この記事では、FlaskとAngularJSを使って簡単なSPAを構築する方法を紹介します。 Flask は軽量の Py です

AngularJS の基本の紹介 AngularJS の基本の紹介 Apr 21, 2018 am 10:37 AM

この記事の内容は AngularJS の基本的な入門に関するもので、必要な友人に共有します。

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

インターネットの普及と発展に伴い、フロントエンド開発の重要性がますます高まっています。フロントエンド開発者として、私たちはさまざまな開発ツールとテクノロジーを理解し、習得する必要があります。その中でも、PHP と AngularJS は非常に便利で人気のあるツールです。この記事では、これら 2 つのツールをフロントエンド開発に使用する方法を説明します。 1. PHP の概要 PHP は、人気のあるオープン ソースのサーバー側スクリプト言語であり、Web 開発に適しており、Web サーバーやさまざまなオペレーティング システム上で実行できます。 PHP の利点は、シンプルさ、スピード、利便性です。

PHP プログラミングで AngularJS を使用するにはどうすればよいですか? PHP プログラミングで AngularJS を使用するにはどうすればよいですか? Jun 12, 2023 am 09:40 AM

Web アプリケーションの人気に伴い、フロントエンド フレームワーク AngularJS の人気も高まっています。 AngularJS は、Google が開発した JavaScript フレームワークで、動的な Web アプリケーション機能を備えた Web アプリケーションの構築に役立ちます。一方、バックエンド プログラミングの場合、PHP は非常に人気のあるプログラミング言語です。サーバーサイド プログラミングに PHP を使用している場合、PHP と AngularJS を使用すると、Web サイトにさらに動的な効果がもたらされます。

PHP と AngularJS を使用してオンライン ファイル管理プラットフォームを開発し、ファイル管理を容易にする PHP と AngularJS を使用してオンライン ファイル管理プラットフォームを開発し、ファイル管理を容易にする Jun 27, 2023 pm 01:34 PM

インターネットの普及に伴い、ネットワークを使用してファイルを転送したり共有したりする人が増えています。ただし、さまざまな理由により、FTP などの従来の方法をファイル管理に使用しても、現代のユーザーのニーズを満たすことができません。したがって、使いやすく、効率的で安全なオンライン ファイル管理プラットフォームを確立することがトレンドになっています。この記事で紹介するオンライン ファイル管理プラットフォームは、PHP と AngularJS をベースにしており、ファイルのアップロード、ダウンロード、編集、削除などの操作を簡単に実行でき、ファイル共有、検索、検索などの一連の強力な機能を提供します。

See all articles