确定活动控制器

时间:2013-08-29 11:16:01

标签: angularjs

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

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

2 个答案:

答案 0 :(得分:5)

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

具有类似情况的

Here is a fiddle,我使用的是一个为每个视图存储不同菜单的Menu服务,该服务有一个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();
}

答案 1 :(得分: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