Đây là một giải pháp khác với việc tham khảo câu trả lời của JavierFuentes:
<a [routerLink]="['self-route', id]" fragment="some-element" (click)="gotoHashtag('some-element')">Jump to Element</a>
trong kịch bả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);
}
}
Điều này cho phép người dùng cuộn trực tiếp đến phần tử, nếu người dùng trực tiếp đến trang có thẻ bắt đầu bằng # trong url.
Nhưng trong trường hợp này, tôi đã đăng ký Fragment tuyến đường trong ngAfterViewChecked
nhưng ngAfterViewChecked()
được gọi liên tục mỗi lần ngDoCheck
và nó không cho phép người dùng cuộn trở lại đầu trang, vì vậy routeFragmentSubscription.unsubscribe
được gọi sau khoảng thời gian chờ 0 mili sau khi chế độ xem được cuộn đến phần tử.
Ngoài ra, gotoHashtag
phương pháp được xác định để cuộn đến phần tử khi người dùng nhấp cụ thể vào thẻ liên kết.
Cập nhật:
Nếu url có chuỗi truy vấn, [routerLink]="['self-route', id]"
trong neo sẽ không bảo toàn các chuỗi truy vấn. Tôi đã thử làm theo cách giải quyết tương tự:
<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
là trong câu hỏi) giả định rằng con đường con đường hy vọng một tham số như{ path: 'users/:id', ....}