7

現在アクティブなコントローラーを特定することはできますか? アクティブとは、ロードされたという意味ではなく、現在のビュー階層で使用されているという意味です。

私がやりたいことは、現在アクティブなコントローラー (現在のビューで使用できるキーボード ショートカット) に応じて、グローバル キーボード ショートカット リストを更新することです。

4

2 に答える 2

5

はい、できます。

これを解決するのに役立つ 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」と呼ばれるアスペクト指向プログラミングをご覧ください。ここにはすでにそのような試みがあります:

https://github.com/mgechev/angular-aop

于 2013-08-30T08:05:56.613 に答える
5

これを行う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();
}
于 2013-08-29T11:50:19.823 に答える