AngularJS コントローラー コントローラーの正しい通信方法_AngularJS
AngularJS は非常に強力なフロントエンド MVC フレームワークです。AngularJS のコントローラーは、ビューのスコープ ($scope) に関数を追加するために使用されます。オブジェクトを作成し、カスタム動作を追加します。
新しいコントローラーを作成するとき、angularJS は新しい $scope オブジェクトを生成してこのコントローラーに渡すのに役立ちます。angularJS アプリケーションのどの部分にも、トップレベルの親スコープがあります。 app が見つかり、その親スコープは $rootScope です。
各 $scope の$root は $rootScope を指し、$cope.$parent は親スコープを指します。
コントローラー間の通信は基本的に、現在のコントローラーが配置されている $scope が他のコントローラーの $scope とどのように通信するかによって決まります。
通常、解決策は 3 つあります:
スコープ継承の原則を使用して、子コントローラーは親コントローラーのコンテンツにアクセスします。 angularJS でイベントを使用します。つまり、メッセージ配信に $on、$emit、$broadcast を使用します。angularJS
でサービスを使用します。
最初の方法
つまり、スコープはスコープ内でネストされます。実際の開発では、このシナリオは比較的まれですが、この方法はより簡単で直接的です。
angularJS のデフォルトでは、現在のスコープで属性が見つからない場合、親スコープで検索され、$rootScope が見つかるまで検索されます。 $rootScope で見つからない場合でも、プログラムは実行されますが、ビューは更新されません。
例
javascript
//Javascript app.controller('ParentController', function($scope) { $scope.person = {greeted: false}; }); app.controller('ChildController', function($scope) { $scope.sayHello = function() { $scope.person.name = 'Ari Lerner'; }; }); //HTML <div ng-controller="ParentController"> <div ng-controller="ChildController"> <a ng-click="sayHello()">Say hello</a> </div> {{ person }} </div> //result {"greeted":true, "name": "Ari Lerner"}
2 番目の方法
スコープは階層的であるため、スコープ チェーンを使用してイベントを渡すことができます。
イベントを配信するには 2 つの方法があります: * $broadcast: トリガーされたイベントは、イベント システム全体に通知するために下方に伝播する必要があります (任意のスコープでこのイベントを処理できるようにします)。 * $emit: グローバル モジュールに通知したい場合は、上位レベルのスコープ ($rootscope など) に通知する必要があるときにイベントを上向きに渡す必要があります。
イベント監視のスコープで $on を使用します。
例
JavaScript
app.controller('ParentController', function($scope) { $scope.$on('$fromSubControllerClick', function(e,data){ console.log(data); // hello }); }); app.controller('ChildController', function($scope) { $scope.sayHello = function() { $scope.$emit('$fromSubControllerClick','hello'); }; }); //HTML <div ng-controller="ParentController"> <div ng-controller="ChildController"> <a ng-click="sayHello()">Say hello</a> </div> </div>
ここでお話したいもう 1 つの問題は、イベント伝播のパフォーマンスの問題です。$broadcast+$on メソッドがすべてのサブスコープに通知する場合、ここでパフォーマンスの問題が発生するため、$emit+$on メソッドを使用することをお勧めします。メソッドのパフォーマンスをさらに向上させるには、スコープが破棄されるときに、定義されたイベント処理関数も一緒に解放する必要があります。
$emit+$on を使用するには、イベント リスナーを $rootScope にバインドする必要があります。例:
JavaScript
angular .module('MyApp') .controller('MyController', ['$scope', '$rootScope', function MyController($scope, $rootScope) { var unbind = $rootScope.$on('someComponent.someCrazyEvent', function(){ console.log('foo'); }); $scope.$on('$destroy', unbind); } ]);
でもこの方法は少し面倒で、複数のイベントハンドリング関数を定義する際に不快になるので改善しましょう
デコレータを使用して新しいイベント バインディング関数を定義します:
JavaScript
angular .module('MyApp') .config(['$provide', function($provide){ $provide.decorator('$rootScope', ['$delegate', function($delegate){ Object.defineProperty($delegate.constructor.prototype, '$onRootScope', { value: function(name, listener){ var unsubscribe = $delegate.$on(name, listener); this.$on('$destroy', unsubscribe); return unsubscribe; }, enumerable: false }); return $delegate; }]); }]);
次に、コントローラーでイベント ハンドラー関数を定義すると:
JavaScript
angular .module('MyApp') .controller('MyController', ['$scope', function MyController($scope) { $scope.$onRootScope('someComponent.someCrazyEvent', function(){ console.log('foo'); }); } ]);
このアプローチを強くお勧めします
第三の方法
angularJS のサービス シングルトン モードの特性を利用して、サービス (サービス) は、アプリケーションのライフサイクル全体を通じてデータを維持し、コントローラー間で通信し、データの一貫性を確保する方法を提供します。
通常、サーバーをカプセル化して、アプリケーションがデータにアクセスしたり、リモートでデータと対話したりするためのインターフェイスを提供します。
例
JavaScript
var myApp = angular.module("myApp", []); myApp.factory('Data', function() { return { name: "Ting" } }); myApp.controller('FirstCtrl', function($scope, Data) { $scope.data = Data; $scope.setName = function() { Data.name = "Jack"; } }); myApp.controller('SecondCtrl', function($scope, Data) { $scope.data = Data; $scope.setName = function() { Data.name = "Moby"; } });
上記は AngularJS コントローラーの正しい通信方法です。皆さんのお役に立てれば幸いです。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









フロントエンドのサーマルペーパーチケット印刷のためのよくある質問とソリューションフロントエンド開発におけるチケット印刷は、一般的な要件です。しかし、多くの開発者が実装しています...

スキルや業界のニーズに応じて、PythonおよびJavaScript開発者には絶対的な給与はありません。 1. Pythonは、データサイエンスと機械学習でさらに支払われる場合があります。 2。JavaScriptは、フロントエンドとフルスタックの開発に大きな需要があり、その給与もかなりです。 3。影響要因には、経験、地理的位置、会社の規模、特定のスキルが含まれます。

JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

同じIDを持つ配列要素をJavaScriptの1つのオブジェクトにマージする方法は?データを処理するとき、私たちはしばしば同じIDを持つ必要性に遭遇します...

Console.log出力の違いの根本原因に関する詳細な議論。この記事では、Console.log関数の出力結果の違いをコードの一部で分析し、その背後にある理由を説明します。 �...

この記事の視差スクロールと要素のアニメーション効果の実現に関する議論では、Shiseidoの公式ウェブサイト(https://www.shisido.co.co.jp/sb/wonderland/)と同様の達成方法について説明します。

JavaScriptを学ぶことは難しくありませんが、挑戦的です。 1)変数、データ型、関数などの基本概念を理解します。2)非同期プログラミングをマスターし、イベントループを通じて実装します。 3)DOM操作を使用し、非同期リクエストを処理することを約束します。 4)一般的な間違いを避け、デバッグテクニックを使用します。 5)パフォーマンスを最適化し、ベストプラクティスに従ってください。

フロントエンドのVSCodeと同様に、パネルドラッグアンドドロップ調整機能の実装を調べます。フロントエンド開発では、VSCODEと同様のVSCODEを実装する方法...
