2013-08-29 66 views
7

是否可以确定当前激活的控制器?与活跃我不是说加载,但在当前视图层次结构中使用。确定激活的控制器

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

回答

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(); 
} 
+3

这是正确的,但它是太容易了。这个案例在页面中只描述了一个控制器,因此定义主动控制器只是推开旧控制器...但是如果页面中有很多控制器,有些是独立的,有些不是?用这种方法你无法知道哪些是活动的。在所有情况下,有一个很好的方法可以实现问题的提问。 – bdavidxyz

+0

好点@dabee,你介意告诉我们你正在谈论的方法吗?我很感兴趣:) – Bema

5

是的,我们可以。

有在网络上的两个资源,这将帮助我们解决这个问题:所以

,因为你可以看到,问题是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”,面向方面的编程。目前已经在这里这样的尝试:

https://github.com/mgechev/angular-aop