นี่คือวิธีแก้ปัญหาอื่นที่มีการอ้างอิงถึงคำตอบของ JavierFuentes:
<a [routerLink]="['self-route', id]" fragment="some-element" (click)="gotoHashtag('some-element')">Jump to Element</a>
ในสคริปต์:
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);
}
}
สิ่งนี้ช่วยให้ผู้ใช้สามารถเลื่อนไปที่องค์ประกอบได้โดยตรงหากผู้ใช้ไปที่หน้าที่มีแฮชแท็กใน url โดยตรง
แต่ในกรณีนี้ฉันได้สมัครรับเส้นทาง Fragment แล้วngAfterViewChecked
แต่ngAfterViewChecked()
ถูกเรียกอย่างต่อเนื่องต่อทุกๆngDoCheck
และไม่อนุญาตให้ผู้ใช้เลื่อนกลับไปด้านบนดังนั้นrouteFragmentSubscription.unsubscribe
เรียกว่าหลังจากหมดเวลา 0 มิลลิวินาทีหลังจากที่มุมมองเลื่อนไปที่องค์ประกอบ
นอกจากนี้gotoHashtag
ยังกำหนดวิธีการเพื่อเลื่อนไปยังองค์ประกอบเมื่อผู้ใช้คลิกที่แท็กจุดยึดโดยเฉพาะ
ปรับปรุง:
หาก url มีสตริงคำค้นหา[routerLink]="['self-route', id]"
ใน anchor จะไม่เก็บสตริงเคียวรี ฉันลองทำตามวิธีแก้ปัญหาเหมือนกัน:
<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
อยู่ในคำถาม) สมมติว่าเส้นทางเส้นทางคาดว่าจะมีพารามิเตอร์เช่น{ path: 'users/:id', ....}