AngularJS $location non aggiornato correttamente quando si utilizza $routeProvider
-
20-12-2019 - |
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();
});
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 */ } );