現在アクティブなコントローラーを特定することはできますか? アクティブとは、ロードされたという意味ではなく、現在のビュー階層で使用されているという意味です。
私がやりたいことは、現在アクティブなコントローラー (現在のビューで使用できるキーボード ショートカット) に応じて、グローバル キーボード ショートカット リストを更新することです。
現在アクティブなコントローラーを特定することはできますか? アクティブとは、ロードされたという意味ではなく、現在のビュー階層で使用されているという意味です。
私がやりたいことは、現在アクティブなコントローラー (現在のビューで使用できるキーボード ショートカット) に応じて、グローバル キーボード ショートカット リストを更新することです。
はい、できます。
これを解決するのに役立つ Web 上の 2 つのリソースがあります。
したがって、お気づきのように、コントローラーのライフサイクル自体について何も知る手段がないため、「どのコントローラーがアクティブなスコープを持っているかを知る手段はありますか」という場合にのみ、質問に答えることができます。
まず、RegisterableCtrl を次のように定義します (私はコードをチェックしていません。それを達成する方法を考えているだけです)。
myApp.controller("RegisterableCtrl", function ($scope, ActiveScopesServices) {
// each time a scope is active this constructor will be called
ActiveScopesServices.add(...);
// each time a scope is removed this event receiver will be called
$scope.$on('$destroy', function dismiss() {
ActiveScopesServices.remove(...);
});
});
次に、アプリのコントローラーごとに、次のように登録する機能を挿入します。
myApp.controller("MyCtrl2", function ($scope, ActiveScopesServices) {
//inject registrable behaviour
$injector.invoke(function ($controller) { $controller('RegisterableCtrl', {$scope: $scope});
//continue to normal code of your controller
});
ここでは、各カスタム コントローラーの先頭で $injector を呼び出す必要があるため、より適切に行うことができます。さらに詳しく知りたい場合は、「AOP」と呼ばれるアスペクト指向プログラミングをご覧ください。ここにはすでにそのような試みがあります:
これを行う1つの方法は、サービスを使用して、アクティブなコントローラーの名前または表示するメニューさえも保存することだと思います。ビューが変更されるたびにコントローラーが実行されるため、関数を実行してサービスを更新できます。
これは同様の状況のフィドルです。ビューごとに異なるメニューを保存するメニューサービスを使用しています。サービスには setMenu() と getMenu() があり、コントローラーが実行されるたびに、どのメニューになるかをサービスに通知しますアクティブ化され、getMenu() を呼び出すたびに、アクティブなメニューが返されます。
/* Services */
app.factory('Menu', function () {
var activeMenu;
var menu = {
home: '<button>A</button><button>B</button>',
list: '<button>C</button><button>D</button>',
settings: '<button>E</button><button>F</button>',
}
function setMenu(name) {
activeMenu = name;
}
function getActiveMenu() {
return menu[activeMenu];
}
return {
setMenu: setMenu,
getMenu : getActiveMenu
}
});
/* Controllers */
function HomeCtrl($scope, Menu) {
Menu.setMenu('home');
$scope.menu = Menu.getMenu();
}
function ListCtrl($scope, Menu) {
Menu.setMenu('list');
$scope.menu = Menu.getMenu();
}
function SettingsCtrl($scope, Menu) {
Menu.setMenu('settings');
$scope.menu = Menu.getMenu();
}