Berikut adalah solusi lain dengan referensi ke jawaban JavierFuentes:
<a [routerLink]="['self-route', id]" fragment="some-element" (click)="gotoHashtag('some-element')">Jump to Element</a>
dalam naskah:
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);
}
}
Ini memungkinkan pengguna untuk langsung menggulir ke elemen, jika pengguna langsung membuka halaman yang memiliki hashtag di url.
Tetapi dalam kasus ini, saya telah berlangganan Fragmen rute ngAfterViewChecked
tetapi ngAfterViewChecked()
dipanggil terus menerus per setiap ngDoCheck
dan itu tidak memungkinkan pengguna untuk menggulir kembali ke atas, jadirouteFragmentSubscription.unsubscribe
dipanggil setelah batas waktu 0 milidetik setelah tampilan digulir ke elemen.
Selain itu, gotoHashtag
metode didefinisikan untuk menggulir ke elemen ketika pengguna secara khusus mengklik tag jangkar.
Memperbarui:
Jika url memiliki string kueri, [routerLink]="['self-route', id]"
di jangkar tidak akan mempertahankan string kueri. Saya mencoba solusi berikut untuk hal yang sama:
<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
ada dalam pertanyaan) dengan asumsi bahwa jalur rute mengharapkan parameter seperti{ path: 'users/:id', ....}