Voici une autre solution de contournement avec référence à JavierFuentes réponse:
<a [routerLink]="['self-route', id]" fragment="some-element" (click)="gotoHashtag('some-element')">Jump to Element</a>
dans le script:
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);
}
}
Cela permet à l'utilisateur de faire défiler directement à l'élément, si l'utilisateur atterrit directement sur la page ayant hashtag dans l'URL.
Mais dans ce cas, je suis abonné à la route Fragment ngAfterViewChecked
mais ngAfterViewChecked()
est appelé en permanence par tous les ngDoCheck
et il ne permet à l'utilisateur de faire défiler en arrière vers le haut, de sorte routeFragmentSubscription.unsubscribe
est appelé après un délai d'attente de 0 Millis après vue est fait défiler jusqu'à l'élément.
De plus, la méthode gotoHashtag
est définie pour faire défiler jusqu'à l'élément lorsque l'utilisateur clique spécifiquement sur l'étiquette d'ancrage.
Mise à jour:
Si url a querystrings, [routerLink]="['self-route', id]"
dans l'ancre chasse gardée wont les querystrings. J'ai essayé de solution suivante pour le même:
<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);
}
à quoi fait référence 'id'? – invot
@invot une variable avec une chaîne (par exemple ce que 123' est dans la question) en supposant que le chemin d'accès attend un paramètre comme '{path: 'users /: id', ....}' –
Que faire si je Voulez-vous que l'option #anchor apparaisse uniquement si le fragment n'est pas null/indéfini? Actuellement, j'ai toujours http://somethi.ng/page#. S'il n'y a pas d'ancre, elle devrait juste être http://somethi.ng/page. S'il y a une ancre, elle devrait toujours être http://somethi.ng/page#anchor. – Kunepro