Ecco un'altra soluzione alternativa con riferimento alla risposta di JavierFuentes:
<a [routerLink]="['self-route', id]" fragment="some-element" (click)="gotoHashtag('some-element')">Jump to Element</a>
nello script:
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);
}
}
Ciò consente all'utente di scorrere direttamente all'elemento, se l'utente atterra direttamente sulla pagina con hashtag nell'URL.
Ma in questo caso, ho sottoscritto il percorso Fragment in ngAfterViewChecked
ma ngAfterViewChecked()
viene chiamato continuamente per ogni ngDoCheck
e non consente all'utente di tornare all'inizio, quindirouteFragmentSubscription.unsubscribe
viene chiamato dopo un timeout di 0 millisecondi dopo che la vista è stata fatta scorrere all'elemento.
Inoltre gotoHashtag
, viene definito il metodo per scorrere fino all'elemento quando l'utente fa clic specificamente sul tag di ancoraggio.
Aggiornare:
Se l'URL ha querystrings, [routerLink]="['self-route', id]"
in anchor non conserverà le querystrings. Ho provato a seguire la soluzione alternativa per lo stesso:
<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
c'è nella domanda) supponendo che il percorso del percorso si aspetti un parametro come{ path: 'users/:id', ....}