Angluar ドキュメントから: すべてのアプリケーションには単一のルート スコープがあります。他のすべてのスコープは、ルート スコープの子孫スコープです。スコープは、モデルの変更を監視するメカニズムを介して、モデルとビューを分離します。
もちろん、これは意見とスタイルの問題になります。私はJohn Papa の Angular Style Guideに非常に近いスタイルに従う傾向があります。
この 2 つを維持し、適切な関心の分離戦略に従って、私のアーキテクチャには、アプリケーション全体で共有されるファクトリ モデルが含まれています。私のコントローラーはすべて、共有データを保持するサービスにバインドされています。
$rootScope をグローバル イベント バスとして使用することは、まさに Angular がそれを使用する方法です。タグを付けて同じことをする必要がありますか? 理由がわかりません。ただし、その場合は、目的が明確に定義されていることを確認し、独自のサービスを使用してイベントをグローバル イベント バスに登録することもできます。そうすれば、アプリを Angular から切り離すことができます。グローバル イベント バスが存在するフレームワークを変更したい場合は、1 か所で変更できます。
これは私が提案しているものです:
グローバルイベントバス
// Angular specific: add service to module
angular.module('app').factory('globalEventBus', GlobalEventBus);
// Angular specific: inject dependencies
GlobalEventBus.$inject(['$rootScope']);
// Non framework specific.
// param: fameworkEventBus will be $rootScope once injected
function GlobalEventBus(fameworkEventBus) {
var globalEventBus = this;
globalEventBus.registerEvent(params...){
fameworkEventBus.
}
return globalEventBus;
}
グローバル データ モデル
私のデータモデルはスマートで、それ自体に関する情報を提供したり、特定のデータを取得/返す関数を含む傾向があります。
// Angular specific: add service to module
angular.module('app').factory('dataModel', DataModel);
function DataModel() {
var dataModel= this;
dataModel.myData = {};
dataModel.GetSpecificData = funtion(param){
return ...
}
return dataModel;
}
コントローラー
// Angular specific
angular.module('app').controller('MyController', MyController);
// Angular specific: inject dependencies to controller
MyController.$inject = ['dataModel'];
// By convention I use the same parameter name as the service.
// It helps me see quickly if my order of injection is correct
function MyController(dataModel) {
var myController = this;
// Bind to the service itself, and NOT to the service data property
myController.myData = dataModel;
myController.doStuff = function(){
}
}
これは、サービス プロパティではなく、サービスへのバインドに関する楽しい投稿です。
全体として、自分にとって何が最適かを判断するのは自分自身である必要があります。優れたシステム アーキテクチャと優れたスタイルのおかげで、完全に回避可能な問題を解決するために数え切れないほどの時間を節約できました。