Hier ist eine weitere Problemumgehung unter Bezugnahme auf die Antwort von JavierFuentes:
<a [routerLink]="['self-route', id]" fragment="some-element" (click)="gotoHashtag('some-element')">Jump to Element</a>
im Skript:
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);
}
}
Auf diese Weise kann der Benutzer direkt zum Element scrollen, wenn der Benutzer direkt auf der Seite mit dem Hashtag in der URL landet.
Aber in diesem Fall habe ich Route Fragment in abonniert, wird ngAfterViewChecked
aber ngAfterViewChecked()
kontinuierlich aufgerufen ngDoCheck
und es erlaubt dem Benutzer nicht, nach oben zu scrollen. routeFragmentSubscription.unsubscribe
Dies wird nach einer Zeitüberschreitung von 0 Millis aufgerufen, nachdem die Ansicht zum Element gescrollt wurde.
Zusätzlich wird eine gotoHashtag
Methode definiert, um zum Element zu scrollen, wenn der Benutzer speziell auf das Ankertag klickt.
Aktualisieren:
Wenn die URL Querystrings enthält, werden die Querystrings [routerLink]="['self-route', id]"
im Anker nicht beibehalten. Ich habe versucht, die gleiche Problemumgehung zu finden:
<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
in der Frage ist) unter der Annahme, dass der Routenpfad einen Parameter wie{ path: 'users/:id', ....}