Entonces, he transcrito la respuesta de @Bema a TypeScript, y así es como se ve:
namespace MyAwesomeApp {
function detectBackButton(
$rootScope: ng.IRootScopeService,
$location: ng.ILocationService
) {
let actualLocation: string = '';
$rootScope.$on('$locationChangeSuccess',
() => {
actualLocation = $location.path();
});
$rootScope.$watch(() => $location.path(),
(newLocation: string, oldLocation: string) => {
if (actualLocation === newLocation) {
}
});
}
detectBackButton.$inject = [
'$rootScope',
'$location'
];
angular
.module('app')
.run(detectBackButton);
}
No tenemos que crear una propiedad fuera del $rootScope
servicio, solo podemos hacer que nuestro código 'cambio exitoso en la ubicación' y 'cambio en la ubicación' se cierren sobre la actualLocation
variable local . A partir de ahí, puede hacer lo que quiera, como en el código original. Por mi parte, consideraría retransmitir un evento para que los controladores individuales puedan hacer lo que sea necesario, pero podría incluir acciones globales si fuera necesario. .
Gracias por la gran respuesta, y espero que esto ayude a otros usuarios de mecanografiado.
$locationChangeSuccess
evento se activa después de la$watch
devolución de llamada. Pero cuando la URL cambia con el botón Atrás / Adelante o lahistory.back()
API, el$locationChangeSuccess
evento se activa antes de la$watch
devolución de llamada. Entonces, cuando el disparo de devolución de llamadaactualLocation
ya es igual anewLocation
. Es cómo angular funciona internamente y esta solución solo usa este comportamiento interno./#/news/?page=2
a/#/news/?page=3
. Para capturarlos también puede usar en$location.absUrl()
lugar de$location.path()
(en ambos lugares donde se usa arriba).