Frage

Ich habe eine Angular JS-Anwendung mit einem defaultController welches den Header der App steuert.Dann habe ich einige andere Controller, einen für jede Ansicht.Die Ansichten werden in geladen <main>.Ich lade die Ansichten mit dem $routeProvider mit diesem Code:

myapp.config(['$routeProvider',
    function($routeProvider) {
        $routeProvider.
            when('/login', {
                templateUrl: 'templates/login.html',
                controller: 'loginController'
            }).
            when('/dashboard', {
                templateUrl: 'templates/dashboard.html',
                controller: 'dashboardController'
            }).
            ...

Ich versuche, eine LOGOUT-Schaltfläche in der Kopfzeile anzuzeigen, wenn es sich bei der geladenen Ansicht um das Dashboard handelt, und sie auszublenden, wenn es sich bei der geladenen Ansicht um die Anmeldeansicht handelt.Um das zu tun, habe ich auf der defaultController Die $location Objekt und ich füge Klassen ordnungsgemäß über die Schaltfläche Abmelden hinzu und entferne sie mit ng-class.

Es gibt nur ein Problem:$location gibt mir den richtigen Pfad, wenn ich die Seite zum ersten Mal lade, aber nachdem ich die Ansicht geändert habe (geändert durch $routeProvider) wird diese Variable nicht mehr aktualisiert, also wenn ich tatsächlich aktiv bin /#/dashboard , Die $location.url ist immer noch aktiv /login.Hier der Controller-Code:

controllers.controller('defaultController', ['$scope', 'ipCookie', '$location', function($scope, ipCookie, $location) {
    $scope.url = $location.url();
    ...

Ich habe es auch mit versucht $window.location.hash mit dem gleichen Ergebnis.

Irgendeine Idee?

BEARBEITEN:Nach der akzeptierten Antwort habe ich Folgendes hinzugefügt defaultController damit es funktioniert

$scope.$on("$locationChangeSuccess", function() {
        $scope.url = $location.url();      
    });
War es hilfreich?

Lösung

Der Standort wird wahrscheinlich im Dienst aktualisiert, nachdem Ihr Standardcontroller geladen wurde.

Sie können entweder das injizieren $location Fügen Sie den Dienst in den Bereich ein und treffen Sie auf dieser Grundlage Entscheidungen in Ihrer Vorlage (dann wird sie automatisch überwacht und neu bewertet), oder Sie können darauf warten $locationChangeSuccess Ereignis.

Beim Injizieren können Sie einfach $scope.location = $location und dann so etwas verwenden wie <a ng-hide="location.path() != '/something'">.

$location sendet die $locationChangeSuccess auf dem Root-Bereich, sodass Sie in jedem verfügbaren Bereich darauf warten können: $scope.$on( "$locationChangeSuccess", function() { /* do something */ } );

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top