2013-10-27 19 views
40

我有我的應用程序中的情況,我需要重新加載菜單每次用戶的角色更改(一個用戶可以在幾個公司中的角色)。

我想知道什麼是解決此問題的最佳方法。

目前我做了以下內容:

app.controller('menuLoadingCtrl', function($location, $scope, authService){ 
    $scope.model.initialRole = authService.getRole(); 
    $scope.$watch(function(){return authService.getRole()}, function(val){ 
     if(val && val != $scope.model.initialRole){ 
       $scope.layout.menuSrc = 'partials/menu.html'; 
     } 
    }); 
}) 

簡單的將用戶重定向到菜單裝載視圖,並從那裏,回到主功能表視圖,一旦角色加載完成。 我有這個包裹在一個函數:

$scope.layout.reloadMenu = function(){ 
     $scope.layout.menuSrc = 'partials/menuLoading.html'; 
    } 

我在任何情況下,在打電話,我想重新加載菜單。

我想知道是否可以通過從$ rootScope上的服務廣播此事件,然後在控制器中監聽它來使此過程更加自動化。

任何想法\建議對此將不勝感激。

回答

52

$watch()正在做污染檢查:功能比較每個消化週期。另一方面,$broadcast()僅在有事件時才傳播事件。當然,$broadcast()$watch()便宜。

但是你真的不得不擔心這裏的表現嗎?循環的一個原始比較是沒有的。然而,在概念上,$watch()顯然是你需要的:你想要做一個動作每次變量變化。我無法想象在這裏使用$broadcast()

+5

+1清晰簡潔。我只想補充一點,OP的代碼首先不應在控制器中包含'$ watch'或'$ broadcast',而OP應該將'authService'包裝在Angular服務中,或者更好的是,將'$ q'諾言。 –

+0

感謝您的及時答覆。 我想這是正確的路徑,唯一的問題是,這種方式我需要調用一個特定的函數,每次我想重新加載菜單,這會導致更多的代碼,因此更多的維護。 對服務級別進行髒檢查,並廣播eveny會自動執行此操作,但不允許我在服務器請求解析時顯示加載程序。 –

+0

另外,我需要爲控制器設置一個標誌,以便同步設置角色類型,例如登錄\註銷。 –

相關問題