是否可以确定当前激活的控制器?与活跃我不是说加载,但在当前视图层次结构中使用。确定激活的控制器
我想要做的是更新全局键盘快捷键列表,具体取决于哪些控制器当前处于活动状态(哪些键盘快捷键可用于当前视图)。
是否可以确定当前激活的控制器?与活跃我不是说加载,但在当前视图层次结构中使用。确定激活的控制器
我想要做的是更新全局键盘快捷键列表,具体取决于哪些控制器当前处于活动状态(哪些键盘快捷键可用于当前视图)。
我认为一种方法是使用服务来存储活动控制器的名称,甚至是要显示的菜单。 每次视图更改时,控制器都将被执行,因此您可以运行一个函数来更新服务。
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();
}
是的,我们可以。
有在网络上的两个资源,这将帮助我们解决这个问题:所以
,因为你可以看到,问题是anwserable只有当它是:“有没有什么知道哪些控制器具有活动范围的意思”,因为无意识知道控制器生命周期本身的任何内容。
首先,定义一个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
});
我们可以做的更好,因为在这里,我们必须在每个自定义控制器的开始调用$注射器。所以如果你想进一步看看所谓的“AOP”,面向方面的编程。目前已经在这里这样的尝试:
这是正确的,但它是太容易了。这个案例在页面中只描述了一个控制器,因此定义主动控制器只是推开旧控制器...但是如果页面中有很多控制器,有些是独立的,有些不是?用这种方法你无法知道哪些是活动的。在所有情况下,有一个很好的方法可以实现问题的提问。 – bdavidxyz
好点@dabee,你介意告诉我们你正在谈论的方法吗?我很感兴趣:) – Bema