7

是否可以确定当前活动的控制器?使用 active 我不是指已加载,而是在当前视图层次结构中使用。

我想要做的是更新全局键盘快捷键列表,具体取决于当前处于活动状态的控制器(哪些键盘快捷键可用于当前视图)。

4

2 回答 2

5

我认为一种方法是使用服务来存储活动控制器的名称,甚至是您想要显示的菜单。每次视图更改时,都会执行控制器,因此您可以运行一个函数来更新服务。

这是一个类似情况的小提琴,我正在使用一个菜单服务,它为每个视图存储不同的菜单,该服务有一个 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 回答
5

我们可以。

网上有两个资源可以帮助我们解决这个问题:

因此,正如您所注意到的,这个问题只有在以下情况下才是可回答的:“是否有办法知道哪些控制器具有活动范围”,因为没有办法了解控制器生命周期本身的任何内容。

首先,定义一个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 回答