是否可以确定当前有效的控制器?有效,我不是指加载,而是在当前视图层次结构中使用。
我想要做的是更新全局键盘快捷键列表,具体取决于当前活动的控制器(当前视图可用的键盘快捷键)。
答案 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”,面向方面的编程。这里已经有了这样的尝试: