2013-08-29 65 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