2013-10-27 5 views
40

Ich habe eine Situation in meiner Anwendung, wo ich das Menü jedes Mal neu laden muss, wenn die Rolle des Benutzers ändert (Ein Benutzer kann Rollen in mehreren Unternehmen haben).

Ich fragte mich, was der beste Weg ist, dieses Problem anzugehen.

zur Zeit mache ich folgendes:

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'; 
     } 
    }); 
}) 

Einfach den Benutzer auf das Menü Laden Ansicht Umleitung, und von dort in die Menüansicht zurück, sobald die Rolle wird geladen getan. Ich habe dies in einer Funktion eingewickelt:

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

, die ich bei jedem Szenario nennen, an das ich mag das Menü neu zu laden.

Ich frage mich, ob ich diesen Prozess automatisieren kann, indem ich dieses Ereignis vom Dienst auf dem $ rootScope ausstrahle und es dann im Controller abhöre.

Irgendwelche Gedanken \ rat auf diesem wird sehr geschätzt.

Antwort

52

$watch() macht Schmutzprüfung: die Funktion vergleicht jeden Verdichtungszyklus. Auf der anderen Seite propagiert $broadcast() ein Ereignis nur dann, wenn es eines gibt. Natürlich ist $broadcast() billiger als $watch().

Aber mussten Sie sich hier wirklich Gedanken über die Leistung machen? Ein primitiver Vergleich nach Zyklus ist nichts. Allerdings ist $watch() konzeptionell klar, was Sie brauchen: Sie möchten eine Aktion jedes Mal eine Variable ändert. Ich kann mir nicht vorstellen, $broadcast() hier zu verwenden.

+5

+1 klar und prägnant. Ich möchte nur hinzufügen, dass der OP-Code nicht "$ watch" oder "$ broadcast" im Controller an erster Stelle haben sollte - eher sollte OP "authService" in einem Angular-Dienst oder noch besser "$ q" umhüllen versprechen. –

+0

Danke für die schnelle Antwort. Ich denke, es ist der richtige Weg zu gehen, das einzige Problem ist, dass auf diese Weise muss ich eine bestimmte Funktion jedes Mal, wenn ich das Menü neu laden wollen, die eine größere Menge an Code, daher mehr Wartung verursacht. Die schmutzige Überprüfung des Service-Levels und das Broadcasting eines eveny werden diese Aktion automatisch ausführen, erlauben es mir jedoch nicht, einen Loader anzuzeigen, während die Anfrage an den Server verrechnet wird. –

+0

Auch ich muss ein Flag für den Controller für einen Fall festlegen, in dem ich den Rollentyp synchron, z. B. Log-in \ Log-out. –

Verwandte Themen