Deseo agregar algunos enlaces en mi página de Angular2, que al hacer clic, saltarán a posiciones específicas dentro de esa página, como hacen los hashtags normales. Entonces los enlaces serían algo como
/users/123#userInfo
/users/123#userPhoto
/users/123#userLikes
etc.
No creo que necesite HashLocationStrategy, ya que estoy bien con la forma normal de Angular2, pero si agrego directamente, el enlace en realidad saltaría a la raíz, no a algún lugar de la misma página. Se agradece cualquier dirección, gracias.
123
está en la pregunta) asumiendo que la ruta de la ruta espera un parámetro como{ path: 'users/:id', ....}
01
o100
no son selectores de CSS válidos. Es posible que desee agregar una letra o algo para que sea un selector válido. Por lo tanto, aún pasaría01
como un fragmento, peroid
tendría que ser algo asíd01
y, pordocument.querySelector('#d'+id)
lo tanto , coincidiría.Aunque la respuesta de Günter es correcta, no cubre el "salto a" la parte de la etiqueta de anclaje .
Por tanto, además de:
... en el componente (padre) donde necesita un comportamiento de "salto a", agregue:
¡Tenga en cuenta que esta es una solución ! Siga este problema de github para futuras actualizaciones. ¡Créditos a Victor Savkin por brindar la solución!
fuente
"['../faq']"
como valor o de lo contrario intentará saltar a / faq / faq / # anchor, en lugar de / faq / # anchor. ¿Es esta la forma correcta de hacerlo o hay una forma más elegante de hacer referencia a la página actual en routerlink? Además,document.querySelector("#" + tree.fragment);
me da un error de selector no válido. ¿Estás seguro de que esto es correcto? Gracias<a [routerLink]="['/faq']" fragment="section6">
?Perdón por responderla un poco tarde; Hay una función predefinida en la Documentación de enrutamiento angular que nos ayuda a enrutar con un hashtag al ancla de la página, es decir, anchorScrolling: 'habilitado'
Paso 1: - Primero importe el RouterModule en el archivo app.module.ts: -
Paso 2: - Vaya a la página HTML, cree la navegación y agregue dos atributos importantes como [routerLink] y un fragmento para hacer coincidir las respectivas Div ID : -
Paso 3: - Cree una sección / div haciendo coincidir el nombre de ID con el fragmento : -
Para su referencia, agregué el ejemplo a continuación creando una pequeña demostración que ayuda a resolver su problema.
fuente
scrollPositionRestoration: 'enabled',
debajo de la opción anchorScrolling :)Un poco tarde, pero aquí hay una respuesta que encontré que funciona:
Y en el componente:
Lo anterior no se desplaza automáticamente a la vista si aterriza en una página que ya tiene un ancla, así que usé la solución anterior en mi ngInit para que también pudiera funcionar con eso:
Asegúrese de importar Router, ActivatedRoute y NavigationEnd al comienzo de su componente y debería estar listo.
Fuente
fuente
document.querySelector ( "#" + f )
me da un error porque espera un selector, no una cadena.element.scrollIntoView()
(sin pasarelement
a la función). Para que sea suave, utilice la siguiente:element.scrollIntoView({block: "end", behavior: "smooth"})
.onAnchorClick()
, debemos pasar a un valor lógico: scrollIntoViewif (element) { element.scrollIntoView(true); }
. Ahora puedo hacer clic dos veces en el mismo enlace y el desplazamiento funcionaNinguna de las respuestas anteriores funcionó para mí. En un último esfuerzo, probé en mi plantilla:
Con esto en mi .ts:
Y funciona como se esperaba para los enlaces internos. En realidad, esto no usa etiquetas de anclaje, por lo que no tocaría la URL en absoluto.
fuente
Las soluciones anteriores no funcionaron para mí ... Esta lo hizo:
Primero, prepárese
MyAppComponent
para el desplazamiento automático en ngAfterViewChecked () ...Luego, navega hasta
my-app-route
enviarprodID
hashtagfuente
Todas las demás respuestas funcionarán en la versión Angular <6.1. Pero si tiene la última versión, entonces no necesitará hacer estos horribles trucos ya que Angular ha solucionado el problema.
aquí está el enlace para emitir
Todo lo que necesita hacer es configurar
scrollOffset
con la opción del segundo argumento delRouterModule.forRoot
método.fuente
Utilizar esto para el módulo de enrutador en
app-routing.module.ts
:Esto estará en tu HTML:
fuente
En archivo html:
En archivo ts:
fuente
Dado que la propiedad del fragmento aún no proporciona desplazamiento de anclaje, esta solución me funcionó:
fuente
Además de la respuesta de Kalyoyan , esta suscripción está vinculada al enrutador y estará activa hasta que la página se actualice por completo. Al suscribirse a eventos de enrutador en un componente, asegúrese de cancelar la suscripción en ngOnDestroy:
fuente
Acabo de hacer que esto funcione en mi propio sitio web, así que pensé que valdría la pena publicar mi solución aquí.
Y luego, en su componente, asegúrese de incluir esto:
fuente
element.scrollIntoView()
oelement.scrollIntoView(true)
. Su versión no se compiló para mí (¿tal vez debido a estrictosNullChecks?)Después de leer todas las soluciones, busqué un componente y encontré uno que hace exactamente lo que pedía la pregunta original: desplazarse para anclar enlaces. https://www.npmjs.com/package/ng2-scroll-to
Cuando lo instala, usa una sintaxis como:
Me ha funcionado muy bien.
fuente
Una solución simple que funciona para páginas sin ningún parámetro de consulta, es compatible con el navegador hacia atrás / adelante, el enrutador y los enlaces profundos.
El tiempo de espera es simplemente para permitir que la página cargue cualquier dato dinámico "protegido" por un * ngIf. Esto también se puede usar para desplazarse a la parte superior de la página al cambiar de ruta; solo proporcione una etiqueta de anclaje superior predeterminada.
fuente
Si no importa tener esos ID de elementos adjuntos a la URL, debería considerar echar un vistazo a este enlace:
Angular 2: vínculos de anclaje al elemento en la página actual
fuente
Aquí hay otra solución alternativa con referencia a la respuesta de JavierFuentes:
en guión:
Esto permite al usuario desplazarse directamente al elemento, si el usuario aterriza directamente en la página que tiene un hashtag en la URL.
Pero en este caso, me he suscrito a la ruta Fragmento en,
ngAfterViewChecked
perongAfterViewChecked()
se llama continuamente por cadangDoCheck
y no permite al usuario desplazarse hacia arriba, por lo querouteFragmentSubscription.unsubscribe
se llama después de un tiempo de espera de 0 milis después de que la vista se desplaza al elemento.Además, el
gotoHashtag
método se define para desplazarse al elemento cuando el usuario hace clic específicamente en la etiqueta de anclaje.Actualizar:
Si la URL tiene cadenas de consulta,
[routerLink]="['self-route', id]"
en anchor no conservará las cadenas de consulta. Intenté seguir la solución alternativa para lo mismo:fuente
¡Este funciona para mí! Este ngFor para que ancle dinámicamente la etiqueta, debe esperar a que se procesen
HTML:
Mi archivo ts:
¡No olvides importar eso
ViewChildren
,QueryList
etc. y agregar algún constructorActivatedRoute
!fuente
A diferencia de otras respuestas, además, también me gustaría añadir
focus()
junto conscrollIntoView()
. También lo estoy usando,setTimeout
ya que salta a la parte superior de lo contrario al cambiar la URL. No estoy seguro de cuál fue la razón de eso, pero parecesetTimeout
que la solución.Origen:
Destino:
Mecanografiado:
fuente
Tuve el mismo problema. La solución: usar View port Scroller https://angular.io/api/common/ViewportScroller#scrolltoanchor
- código app-routing.module.ts:
- Componente HTML
- Código del componente:
fuente
Acabo de probar un complemento muy útil disponible en nmp - ngx-scroll-to , que funciona muy bien para mí. Sin embargo, está diseñado para Angular 4+, pero tal vez alguien encuentre útil esta respuesta.
fuente
Probé la mayoría de estas soluciones, pero tuve problemas para salir y volver con otro fragmento que no funcionaría, así que hice algo un poco diferente que funciona al 100% y me deshago del hash feo en la URL.
tl; dr aquí hay una mejor manera de lo que he visto hasta ahora.
fuente