İşte JavierFuentes cevabına referansla ilgili başka bir geçici çözüm:
<a [routerLink]="['self-route', id]" fragment="some-element" (click)="gotoHashtag('some-element')">Jump to Element</a>
komut dosyasında:
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);
}
}
Bu, kullanıcının URL'sinde hashtag bulunan sayfaya doğrudan gelirse, kullanıcının doğrudan öğeye kaydırmasına izin verir.
Ancak bu durumda, Rota Fragmanına abone oldum ngAfterViewChecked
ancak ngAfterViewChecked()
her seferinde sürekli olarak çağrılıyor ngDoCheck
ve kullanıcının en üste geri dönmesine izin vermiyor, bu yüzdenrouteFragmentSubscription.unsubscribe
görünüm öğeye kaydırıldıktan sonra 0 milisaniyelik bir zaman aşımından sonra çağrılıyor.
Ek olarak gotoHashtag
, kullanıcı özellikle bağlantı etiketini tıkladığında öğeye kaydırmak için yöntem tanımlanır.
Güncelleme:
Url'de sorgu dizeleri varsa [routerLink]="['self-route', id]"
bağlantıda sorgu dizeleri korunmaz. Aynı geçici çözümü takip etmeyi denedim:
<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
rota yolu bir parametre gibi beklediğini varsayarsak söz konusu olan){ path: 'users/:id', ....}