AngularJS: ¿Cómo borrar los parámetros de consulta en la URL?


Mi aplicación AngularJS necesita tener acceso al perfil de LinkedIn del usuario. Para hacer eso necesito redirigir al usuario a una URL de LinkedIn que contiene un parámetro callback redirect_uri que le dirá a LinkedIn que redirija al usuario de nuevo a mi aplicación web e incluya un param de consulta de "código" en la URL. Es un flujo tradicional Oauth 2.0.

Todo funciona muy bien, excepto que LinkedIn redirige al usuario a la siguiente URL:

http://localhost:8080/?code=XXX&state=YYY#/users/123/providers/LinkedIn/social-sites

Me gustaría eliminar ?code=XXX&state=YYY de la URL con el fin de hacerlo limpio. El usuario no necesita ver los parámetros de consulta que recibí de LinkedIn redirect.

He intentado $location.absUrl($location.path() + $location.hash()).replace(), pero mantiene los parámetros de consulta en la URL.

Tampoco puedo extraer los parámetros de consulta, por ejemplo, "code", usando ($location.search()).code. Parece como tener ? antes de # en la URL de arriba está engañando Angular.

 123
Author: simeg, 2013-06-29

15 answers

Utilizo

$location.search('key', null)

Ya que esto no solo elimina mi clave, sino que la elimina de la visibilidad en la URL.

 140
Author: Julius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-28 09:45:23

Terminé recibiendo la respuesta del foro AngularJS. Ver este hilo para más detalles


El enlace es a un hilo de Google Groups, que es difícil de leer y no proporciona una respuesta clara. Para eliminar los parámetros de URL use

$location.url($location.path());
 99
Author: alecswan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-20 16:45:02

Para eliminar TODOS los parámetros de consulta, haga:

$location.search({});

Para eliminar UN parámetro de consulta particular, haga:

$location.search('myQueryParam', null);
 57
Author: Rahul Desai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-04 18:07:42

Para borrar un elemento elimínelo y llame a compose compose

    if ($location.$$search.yourKey) {
        delete $location.$$search.yourKey;
        $location.$$compose();
    }

Derivado de angularjs fuente: https://github.com/angular/angular.js/blob/c77b2bcca36cf199478b8fb651972a1f650f646b/src/ng/location.js#L419-L443

 28
Author: basarat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-31 04:55:14

Puede eliminar un parámetro de consulta específico utilizando:

delete $location.$$search.nameOfParameter;

O puede borrar todos los parámetros de consulta configurando la búsqueda en un objeto vacío:

$location.$$search = {};
 27
Author: Quintin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-06 20:24:56

En el momento de escribir, y como se mencionó anteriormente por @Bosh, html5mode debe ser true para poder establecer $location.search() y que se refleje de nuevo en la URL visual de la ventana.

Véase https://github.com/angular/angular.js/issues/1521 para más información.

Pero si html5mode es true puede borrar fácilmente la cadena de consulta de la URL con:

$location.search('');

O

$location.search({});

Esto también alterará la URL visual de la ventana.

(Probado en AngularJS version 1.3.0-rc.1 with html5Mode(true).)

 26
Author: Fredric,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-13 08:46:20

Necesidad de hacer que funcione cuando html5mode = false?

Todas las otras respuestas funcionan solo cuando Angular html5mode es true. Si estás trabajando fuera de html5mode, entonces $location se refiere solo a la ubicación "falsa" que vive en tu hash {y entonces $location.search no puede ver/editar/arreglar los parámetros de búsqueda de la página real.

Aquí hay una solución alternativa, que se insertará en el HTML de la página antes de cargas angulares:

<script>
  if (window.location.search.match("code=")){
    var newHash = "/after-auth" + window.location.search;
    if (window.history.replaceState){
      window.history.replaceState( {}, "", window.location.toString().replace(window.location.search, ""));
    }
    window.location.hash = newHash;
  }
</script>
 12
Author: Bosh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-10 05:54:46

Solo use

$location.url();

En lugar de

$location.path();
 4
Author: kevinius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-20 16:09:49

Si desea mover a otra URL y borrar los parámetros de consulta, simplemente use:

$location.path('/my/path').search({});
 3
Author: luizfelippe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-23 20:45:38

Si está utilizando parámetros de rutas, simplemente borre rout routeParams

$routeParams= null;
 1
Author: Oswaldo Alvarez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-22 04:06:26

¿Qué tal simplemente establecer el hash de ubicación a null

$location.hash(null);
 0
Author: Bwyss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-24 14:59:31

Si procesa los parámetros inmediatamente y luego pasa a la página siguiente, puede poner un signo de interrogación al final de la nueva ubicación.

Por ejemplo, si hubiera hecho $ubicación.path ('/nextPage');

Puedes hacer esto en su lugar: $ubicación.path ('/nextPage?');

 0
Author: user5487176,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-25 22:50:40

He intentado las respuestas anteriores, pero no pude conseguir que funcionen. El único código que funcionó para mí fue $window.location.search = ''

 0
Author: Gwen Au,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-09 00:49:14

Puedo reemplazar todos los parámetros de consulta con esta sola línea: $location.search({});
Fácil de entender y una manera fácil de eliminarlos.

 0
Author: Lucas Reppe Welander,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-28 08:56:55

La respuesta aceptada funcionó para mí, pero necesitaba profundizar un poco más para solucionar los problemas con el botón atrás.

Lo que noté es que si enlazo a una página usando <a ui-sref="page({x: 1})">, luego elimino la cadena de consulta usando $location.search('x', null), no obtengo una entrada adicional en el historial de mi navegador, por lo que el botón atrás me lleva de vuelta a donde empecé. Aunque siento que esto está mal porque no creo que Angular deba eliminar automáticamente esta entrada del historial para mí, este es en realidad el comportamiento deseado para mi caso de uso particular.

El problema es que si enlazo a la página usando <a href="/page/?x=1"> en su lugar, luego elimino la cadena de consulta de la misma manera, hago obtener una entrada adicional en el historial de mi navegador, por lo que tengo que hacer clic en el botón atrás dos veces para volver a donde empecé. Este es un comportamiento inconsistente, pero en realidad esto parece más correcto.

Puedo solucionar fácilmente el problema con los enlaces href usando $location.search('x', null).replace(), pero luego esto rompe la página cuando aterrizas en ella a través de un ui-sref link, así que esto no es bueno.

Después de mucho jugueteo, esta es la solución que se me ocurrió:

En la función run de mi aplicación agregué esto:

$rootScope.$on('$locationChangeSuccess', function () {
    $rootScope.locationPath = $location.path();
});

Luego uso este código para eliminar el parámetro de cadena de consulta:

$location.search('x', null);

if ($location.path() === $rootScope.locationPath) {
    $location.replace();
}
 0
Author: Moo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-11 13:45:34