AngularJS $ubicación no se actualiza correctamente cuando se usa $routeProvider
-
20-12-2019 - |
Pregunta
Tengo una aplicación Angular JS con un defaultController
que controla el encabezado de la aplicación.Luego tengo otros controladores, uno para cada vista.Las vistas se cargan en el <main>
.Cargo las vistas usando el $routeProvider
con este código:
myapp.config(['$routeProvider',
function($routeProvider) {
$routeProvider.
when('/login', {
templateUrl: 'templates/login.html',
controller: 'loginController'
}).
when('/dashboard', {
templateUrl: 'templates/dashboard.html',
controller: 'dashboardController'
}).
...
Estoy intentando mostrar un botón SALIR dentro del encabezado cuando la vista cargada es el panel y ocultarlo si la vista cargada es la vista de inicio de sesión.Para hacer eso tengo en el defaultController
el $location
objeto y agrego y elimino correctamente clases desde el botón CERRAR SESIÓN con ng-class
.
Solo hay un problema:$ubicación me da la ruta correcta la primera vez que cargo la página, pero después de cambiar la vista (cambiada por el $routeProvider
) esa variable ya no se actualiza, así que cuando estoy realmente en /#/dashboard
, el $location.url
todavía está encendido /login
.Aquí el código del controlador:
controllers.controller('defaultController', ['$scope', 'ipCookie', '$location', function($scope, ipCookie, $location) {
$scope.url = $location.url();
...
También lo intenté con $window.location.hash
con el mismo resultado.
¿Alguna idea?
EDITAR:Después de la respuesta aceptada, esto es lo que agregué en el defaultController
para que funcione
$scope.$on("$locationChangeSuccess", function() {
$scope.url = $location.url();
});
Solución
La ubicación probablemente se actualice en el servicio después de cargar el controlador predeterminado.
Puedes inyectar el $location
servicio en el alcance y tomar decisiones en su plantilla en función de él (luego será observado y reevaluado automáticamente) o puede escuchar el $locationChangeSuccess
evento.
Al inyectar, simplemente puede $scope.location = $location
y luego usar algo como <a ng-hide="location.path() != '/something'">
.
$location
transmite el $locationChangeSuccess
en el ámbito raíz, por lo que debería poder escucharlo en cualquier ámbito que tenga disponible: $scope.$on( "$locationChangeSuccess", function() { /* do something */ } );