Domanda

Ho un'applicazione Angular JS con a defaultController che controlla l'intestazione dell'app.Poi ho altri controller, uno per ogni vista.Le visualizzazioni vengono caricate nel file <main>.Carico le visualizzazioni utilizzando il file $routeProvider con questo codice:

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

Sto provando a visualizzare un pulsante LOGOUT all'interno dell'intestazione quando la vista caricata è la dashboard e nasconderlo se la vista caricata è la vista di accesso.Per fare ciò ho sul defaultController IL $location object e aggiungo e rimuovo correttamente le classi dal pulsante LOGOUT con ng-class.

C'è solo un problema:$location mi fornisce il percorso corretto la prima volta che carico la pagina, ma dopo aver modificato la visualizzazione (modificata da $routeProvider) quella variabile non viene più aggiornata, quindi quando sono effettivamente attivo /#/dashboard , IL $location.url è ancora attivo /login.Ecco il codice del controller:

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

Ho provato anche con $window.location.hash con lo stesso risultato.

Qualche idea?

MODIFICARE:dopo la risposta accettata questo è ciò che ho aggiunto su defaultController per farlo funzionare

$scope.$on("$locationChangeSuccess", function() {
        $scope.url = $location.url();      
    });
È stato utile?

Soluzione

La posizione probabilmente viene aggiornata nel servizio dopo il caricamento del controller predefinito.

Puoi iniettare il $location servizio nell'ambito e prendere decisioni nel modello in base ad esso (quindi verrà automaticamente osservato e rivalutato) oppure potresti ascoltare il $locationChangeSuccess evento.

Quando fai l'iniezione, puoi semplicemente $scope.location = $location e poi usa qualcosa di simile <a ng-hide="location.path() != '/something'">.

$location trasmette il $locationChangeSuccess sull'ambito root, quindi dovresti essere in grado di ascoltarlo su qualunque ambito tu abbia a disposizione: $scope.$on( "$locationChangeSuccess", function() { /* do something */ } );

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top