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();      
    });
¿Fue útil?

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 */ } );

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top