¿Alguno de ustedes sabe cómo manejar bien el enlace hash de anclaje en AngularJS ?
Tengo el siguiente marcado para una simple página de preguntas frecuentes
<a href="#faq-1">Question 1</a>
<a href="#faq-2">Question 2</a>
<a href="#faq-3">Question 3</a>
<h3 id="faq-1">Question 1</h3>
<h3 id="faq-2">Question 2</h3>
<h3 id="fa1-3">Question 3</h3>
Al hacer clic en cualquiera de los enlaces anteriores, AngularJS me intercepta y me dirige a una página completamente diferente (en mi caso, una página 404 ya que no hay rutas que coincidan con los enlaces).
Mi primer pensamiento fue crear una ruta que coincida con " / faq /: chapter " y en el controlador correspondiente verificar $routeParams.chapter
después de un elemento coincidente y luego usar jQuery para desplazarnos hacia abajo.
Pero luego AngularJS me vuelve a cagar y de todos modos solo se desplaza a la parte superior de la página.
Entonces, ¿alguien aquí hizo algo similar en el pasado y conoce una buena solución?
Editar: Cambiar a html5Mode debería resolver mis problemas, pero de todos modos tenemos que admitir IE8 +, así que me temo que no es una solución aceptada: /
fuente
ng-href=""
en su lugar.Respuestas:
Usted está buscando
$anchorScroll()
.Aquí está la documentación (horrible).
Y aquí está la fuente.
Básicamente solo lo inyecta y lo llama en su controlador, y lo desplazará a cualquier elemento con la identificación que se encuentra en
$location.hash()
Aquí hay un saqueador para demostrar
EDITAR: para usar esto con enrutamiento
Configure su enrutamiento angular como de costumbre, luego simplemente agregue el siguiente código.
y tu enlace se vería así:
Aquí hay un Plunker que muestra el desplazamiento con enrutamiento y $ anchorScroll
Y aún más simple:
y tu enlace se vería así:
fuente
<a href="#foo">foo</a>
. Mi ejemplo de código era mostrar el desplazamiento a una identificación en routechange.$location.search('scrollTo', null)
En mi caso, noté que la lógica de enrutamiento estaba funcionando si modificaba el
$location.hash()
. El siguiente truco funcionó ...fuente
$location.hash(my_id); $anchorScroll; $location.hash(null)
. Impide la recarga y no tengo que administrar laold
variable.No es necesario cambiar ningún enrutamiento ni nada más, solo debe usarse
target="_self"
al crear los enlacesEjemplo:
Y use el
id
atributo en sus elementos html como este:No es necesario usar ## como se señala / menciona en los comentarios ;-)
fuente
fuente
Si siempre conoce la ruta, simplemente puede agregar el ancla de esta manera:
donde
route
es la ruta angular actual yanchorID
coincide con un<a id="anchorID">
lugar en la páginafuente
reloadOnSearch: false
esa ruta en la configuración de rutas, angular no activará un cambio de ruta y simplemente se desplazará a la identificación. En combinación con la ruta completa especificada en laa
etiqueta, diría que esta es la solución más simple y directa.$anchorScroll
funciona para esto, pero hay una forma mucho mejor de usarlo en versiones más recientes de Angular.Ahora,
$anchorScroll
acepta el hash como argumento opcional, para que no tenga que cambiar$location.hash
en absoluto. ( documentación )Esta es la mejor solución porque no afecta la ruta en absoluto. No pude hacer funcionar ninguna de las otras soluciones porque estoy usando ngRoute y la ruta se volvería a cargar tan pronto como la configurara
$location.hash(id)
, antes$anchorScroll
podría hacer su magia.Aquí está cómo usarlo ... primero, en la directiva o controlador:
y luego en la vista:
Además, si necesita tener en cuenta una barra de navegación fija (u otra IU), puede establecer el desplazamiento para $ anchorScroll de esta manera (en la función de ejecución del módulo principal):
fuente
id
en esa vista.ngRoute
y la versión más nueva de Angular.Esta fue mi solución usando una directiva que parece más Angular-y porque estamos tratando con el DOM:
Por aquí
github
CÓDIGO
HTML
Usé el servicio $ anchorScroll. Para contrarrestar la actualización de la página que acompaña al cambio de hash, seguí adelante y cancelé el evento locationChangeStart. Esto funcionó para mí porque tenía una página de ayuda conectada a un ng-switch y las actualizaciones esencialmente romperían la aplicación.
fuente
Intenta establecer un prefijo hash para rutas angulares
$locationProvider.hashPrefix('!')
Ejemplo completo:
fuente
Resolví esto en la lógica de ruta para mi aplicación.
fuente
Esta es una publicación antigua, pero pasé mucho tiempo investigando varias soluciones, así que quería compartir una más simple. Solo agregando
target="_self"
a la<a>
etiqueta lo arregló para mí. El enlace funciona y me lleva a la ubicación correcta en la página.Sin embargo, Angular todavía inyecta algo extraño con el # en la URL, por lo que puede tener problemas al usar el botón Atrás para la navegación y tal después de usar este método.
fuente
Este puede ser un nuevo atributo para ngView, pero he podido obtener enlaces hash de anclaje para trabajar con
angular-route
elngView autoscroll
atributo y 'doble hash'.ngView (ver desplazamiento automático)
(El siguiente código se usó con correa angular)
fuente
Podría hacer esto así:
fuente
Aquí hay una especie de solución sucia al crear una directiva personalizada que se desplazará al elemento especificado (con "preguntas frecuentes" codificadas)
http://plnkr.co/edit/Po37JFeP5IsNoz5ZycFs?p=preview
fuente
$anchorScroll
, vea mi respuesta.fuente
Si no le gusta usar,
ng-click
aquí hay una solución alternativa. Utiliza afilter
para generar la URL correcta en función del estado actual. Mi ejemplo usa ui.router .El beneficio es que el usuario verá dónde va el enlace.
El filtro:
fuente
Mi solución con ng-route fue esta simple directiva:
El html se ve así:
fuente
scroll-to="yourid"
y nombrar la directivascrollTo
(y acceder al atributo comoattrs["scrollTo"]
? Además, sin una inclusión explícita de jQuery, el controlador debe estar vinculadoelement.on('click', function (e) {..})
.Podría intentar usar anchorScroll .
Ejemplo
Entonces el controlador sería:
Y la vista:
... y ningún secreto para la identificación del ancla:
fuente
Estaba tratando de hacer que mi aplicación Angular se desplazara a una carga de opon de anclaje y encontré las reglas de reescritura de URL de $ routeProvider.
Después de una larga experimentación me decidí por esto:
fuente
No estoy 100% seguro de si esto funciona todo el tiempo, pero en mi aplicación esto me da el comportamiento esperado.
Digamos que está en la página ACERCA DE y tiene la siguiente ruta:
Ahora en tu HTML
En conclusión
Incluyendo el nombre de la página antes del ancla hizo el truco para mí. Déjame saber sobre tus pensamientos.
Abajo
Esto volverá a representar la página y luego se desplazará al ancla.
ACTUALIZAR
Una mejor manera es agregar lo siguiente:
fuente
Obtenga su función de desplazamiento fácilmente. También es compatible con el desplazamiento animado / suave como una característica adicional. Detalles de la biblioteca de desplazamiento angular :
Github - https://github.com/oblador/angular-scroll
Bower :
bower install --save angular-scroll
npm :
npm install --save angular-scroll
Versión minfied - solo 9kb
Desplazamiento suave (desplazamiento animado) : sí
Scroll Spy : sí
Documentación - excelente
Demostración - http://oblador.github.io/angular-scroll/
Espero que esto ayude.
fuente
Basado en @Stoyan se me ocurrió la siguiente solución:
fuente
En el cambio de ruta, se desplazará hasta la parte superior de la página.
pon este código en tu controlador.
fuente
En mi opinión, @slugslog lo tenía, pero cambiaría una cosa. En su lugar, usaría reemplazar para que no tenga que volver a configurarlo.
Búsqueda de documentos para "Método de reemplazo"
fuente
Ninguna de las soluciones anteriores me funciona, pero acabo de probar esto y funcionó,
Entonces me di cuenta de que necesito notificar a la página para comenzar con la página de índice y luego usar el ancla tradicional.
fuente
En algún momento en la aplicación angularjs, la navegación hash no funciona y las bibliotecas bootstrap jquery javascript hacen un uso extensivo de este tipo de navegación, para que funcione agregue
target="_self"
a la etiqueta de anclaje. p.ej<a data-toggle="tab" href="#id_of_div_to_navigate" target="_self">
fuente
Ver https://code.angularjs.org/1.4.10/docs/api/ngRoute/provider/ $ routeProvider
Establecer esto en falso hizo el truco sin todo lo anterior para mí.
fuente
Estoy usando AngularJS 1.3.15 y parece que no tengo que hacer nada especial.
https://code.angularjs.org/1.3.15/docs/api/ng/provider/ $ anchorScrollProvider
Entonces, lo siguiente funciona para mí en mi html:
No tuve que hacer ningún cambio en mi controlador o JavaScript en absoluto.
fuente