2012-08-02 7 views
17

El JavaScript regular tiene window.onbeforeload. ¿Cómo emulo lo mismo en AngularJS con rutas HTML5?Equivalencia de window.onbeforeload en AngularJS para las rutas

Hay $ beforeRouteChange, pero no le permite cancelar el evento por lo que yo sé.

Para aclarar: window.onbeforeunload funcionaría para la navegación fuera de la página, pero no para la navegación dentro de la página, p. pasando de un controlador a otro solo a través de la API de historial de HTML5.

Respuesta

15

Hay un evento $locationChangeStart que se puede cancelar.

Dado que aún no se ha documentado, aquí está la prueba de la unidad que describe cómo afecta el servicio $route. https://github.com/angular/angular.js/blob/v1.0.1/test/ng/routeSpec.js#L63

Esto no proporciona una confirmación para el usuario como window.onbeforeunload. Debe traer su propio servicio de diálogo y reiniciar el proceso de cambio de ubicación para obtener el mismo efecto (o puede simplemente usar el $window.confirm sincrónico).

+1

¿Funciona para 'button' espalda? – Freewind

+0

@Freewind hay un check-in el 1 de mayo de 2013 para que funcione para el botón Atrás: https://github.com/angular/angular.js/commit/dc9a580617a838b63cbf5feae362b6f9cf5ed986 – Nils

22

Añadir este:

$scope.$on('$destroy', function() { 
    window.onbeforeunload = undefined; 
}); 
$scope.$on('$locationChangeStart', function(event, next, current) { 
    if(!confirm("Are you sure you want to leave this page?")) { 
     event.preventDefault(); 
    } 
}); 
+5

Para angular-ui-router '$ stateChangeStart' should utilizar. Y no maneja la actualización de la página, ya que se maneja en el caso de 'window.onbeforeunload' –

+0

. Tuve que escuchar' $ stateChangeStart' en '$ rootScope' en lugar de' $ scope' para que esto funcione para mí. Tenga en cuenta que si hace esto, tendrá que anular el registro manual de este detector de eventos cuando se destruya su alcance actual ('$ scope. $ On ('$ destroy, ...)'). –

5

Si está utilizando angular-ui-enrutador es necesario utilizar $stateChangeStart en lugar de $locationChangeStart.

+1

¡Totalmente cierto! Se usa '$ locationChangeStart' con angular-ui-router cuando el controlador se" inicia "y no cuando el usuario abandona una página. –

0

Cuando se utiliza la interfaz de usuario -Router versión 1.0.0+, utilice $transitions.onStart en lugar de $stateChangeStart. Consulte la documentación transition hooks.

Los $stateChange* eventos están en desuso partir de la versión 1.0.0 (source):

Todos los eventos estatales, (es decir $stateChange* y amigos) ahora están en desuso y desactivado por defecto. En lugar de escuchar eventos, use la API de Transition Hook.

Código de ejemplo para abortar una transición (source):

$transitions.onStart({}, function(transition) { 
    if (transition.to().name === 'unreachable') { 
    return false; 
    } 
} 
Cuestiones relacionadas