Aquí hay otra solución alternativa con referencia a la respuesta de JavierFuentes:
<a [routerLink]="['self-route', id]" fragment="some-element" (click)="gotoHashtag('some-element')">Jump to Element</a>
en guión:
import {ActivatedRoute} from "@angular/router";
import {Subscription} from "rxjs/Subscription";
export class Links {
private scrollExecuted: boolean = false;
constructor(private route: ActivatedRoute) {}
ngAfterViewChecked() {
if (!this.scrollExecuted) {
let routeFragmentSubscription: Subscription;
routeFragmentSubscription = this.route.fragment.subscribe(fragment => {
if (fragment) {
let element = document.getElementById(fragment);
if (element) {
element.scrollIntoView();
this.scrollExecuted = true;
// Free resources
setTimeout(
() => {
console.log('routeFragmentSubscription unsubscribe');
routeFragmentSubscription.unsubscribe();
}, 0);
}
}
});
}
}
gotoHashtag(fragment: string) {
const element = document.querySelector("#" + fragment);
if (element) element.scrollIntoView(element);
}
}
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
pero ngAfterViewChecked()
se llama continuamente por cada ngDoCheck
y no permite al usuario desplazarse hacia arriba, por lo que routeFragmentSubscription.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:
<a (click)="gotoHashtag('some-element')">Jump to Element</a>
constructor( private route: ActivatedRoute,
private _router:Router) {
}
...
...
gotoHashtag(fragment: string) {
let url = '';
let urlWithSegments = this._router.url.split('#');
if(urlWithSegments.length){
url = urlWithSegments[0];
}
window.location.hash = fragment;
const element = document.querySelector("#" + fragment);
if (element) element.scrollIntoView(element);
}
123
está en la pregunta) asumiendo que la ruta de la ruta espera un parámetro como{ path: 'users/:id', ....}