是否可以确定当前活动的控制器?使用 active 我不是指已加载,而是在当前视图层次结构中使用。
我想要做的是更新全局键盘快捷键列表,具体取决于当前处于活动状态的控制器(哪些键盘快捷键可用于当前视图)。
是否可以确定当前活动的控制器?使用 active 我不是指已加载,而是在当前视图层次结构中使用。
我想要做的是更新全局键盘快捷键列表,具体取决于当前处于活动状态的控制器(哪些键盘快捷键可用于当前视图)。
我认为一种方法是使用服务来存储活动控制器的名称,甚至是您想要显示的菜单。每次视图更改时,都会执行控制器,因此您可以运行一个函数来更新服务。
这是一个类似情况的小提琴,我正在使用一个菜单服务,它为每个视图存储不同的菜单,该服务有一个 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();
}
我们可以。
网上有两个资源可以帮助我们解决这个问题:
因此,正如您所注意到的,这个问题只有在以下情况下才是可回答的:“是否有办法知道哪些控制器具有活动范围”,因为没有办法了解控制器生命周期本身的任何内容。
首先,定义一个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”,即面向方面的编程。这里已经有这样的尝试: