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, ngAfterViewCheckedpero ngAfterViewChecked()se llama continuamente por cada ngDoChecky no permite al usuario desplazarse hacia arriba, por lo que routeFragmentSubscription.unsubscribese llama después de un tiempo de espera de 0 milis después de que la vista se desplaza al elemento.
Además, el gotoHashtagmé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);
}
123está en la pregunta) asumiendo que la ruta de la ruta espera un parámetro como{ path: 'users/:id', ....}