Je souhaite ajouter des liens sur ma page Angular2, qui, lorsque vous cliquez dessus, passeront à des positions spécifiques dans cette page, comme le font les hashtags normaux. Donc, les liens seraient quelque chose comme
/users/123#userInfo
/users/123#userPhoto
/users/123#userLikes
etc.
Je ne pense pas avoir besoin de HashLocationStrategy, car je suis d'accord avec la méthode Angular2 normale, mais si j'ajoute directement, le lien passerait en fait à la racine, pas quelque part sur la même page. Toute direction est appréciée, merci.
123
est dans la question) en supposant que le chemin de la route attend un paramètre comme{ path: 'users/:id', ....}
01
ou à des100
sélecteurs CSS valides. Vous voudrez peut-être ajouter une lettre ou quelque chose pour en faire un sélecteur valide. Vous passeriez donc toujours01
comme un fragment, mais leid
devrait être quelque chose commed01
et doncdocument.querySelector('#d'+id)
correspondre.Bien que la réponse de Günter soit correcte, elle ne couvre pas le "saut vers" la partie de la balise d'ancrage .
Par conséquent, en plus de:
... dans le composant (parent) où vous avez besoin d'un comportement "sauter à", ajoutez:
Veuillez noter qu'il s'agit d'une solution de contournement ! Suivez ce numéro de github pour les futures mises à jour. Crédits à Victor Savkin pour avoir fourni la solution!
la source
"['../faq']"
comme valeur ou bien il essaiera de sauter à / faq / faq / # anchor, insteaf of / faq / # anchor. Est-ce la bonne façon de le faire ou existe-t-il une manière plus élégante de se référer à la page actuelle dans routerlink? En outre,document.querySelector("#" + tree.fragment);
me donne une erreur de sélecteur non valide. Êtes-vous sûr que c'est exact? Merci<a [routerLink]="['/faq']" fragment="section6">
?Désolé d'avoir répondu un peu tard; Il existe une fonction prédéfinie dans la documentation du routage angulaire qui nous aide à acheminer avec un hashtag vers l'ancre de page, c'est-à-dire anchorScrolling: 'enabled'
Étape 1: - Importez d'abord le RouterModule dans le fichier app.module.ts: -
Étape 2: - Accédez à la page HTML, créez la navigation et ajoutez deux attributs importants tels que [routerLink] et fragment pour faire correspondre les identifiants Div respectifs : -
Étape 3: - Créez une section / div en faisant correspondre le nom de l' ID avec le fragment : -
Pour votre référence, j'ai ajouté l'exemple ci-dessous en créant une petite démo qui aide à résoudre votre problème.
la source
scrollPositionRestoration: 'enabled',
option sous anchorScrolling :)Un peu tard mais voici une réponse que j'ai trouvée qui fonctionne:
Et dans le composant:
Ce qui précède ne fait pas défiler automatiquement jusqu'à la vue si vous arrivez sur une page avec déjà une ancre, j'ai donc utilisé la solution ci-dessus dans mon ngInit afin qu'elle puisse également fonctionner avec cela:
Assurez-vous d'importer Router, ActivatedRoute et NavigationEnd au début de votre composant et tout devrait être prêt.
La source
la source
document.querySelector ( "#" + f )
me donne une erreur car elle attend un sélecteur, pas une chaîne.element.scrollIntoView()
(sans passerelement
à la fonction). Pour le rendre lisse, utilisez ceci:element.scrollIntoView({block: "end", behavior: "smooth"})
.onAnchorClick()
, il faut passer un booléen à scrollIntoView:if (element) { element.scrollIntoView(true); }
. Maintenant je peux cliquer deux fois sur le même lien et faire défiler les oeuvresAucune des réponses précédentes n'a fonctionné pour moi. Dans un dernier effort, j'ai essayé dans mon modèle:
Avec ceci dans mes .ts:
Et cela fonctionne comme prévu pour les liens internes. Cela n'utilise pas réellement de balises d'ancrage, donc cela ne toucherait pas du tout l'URL.
la source
Les solutions ci-dessus n'ont pas fonctionné pour moi ... Celui-ci l'a fait:
Tout d'abord, préparez-vous
MyAppComponent
au défilement automatique dans ngAfterViewChecked () ...Ensuite, accédez à l'
my-app-route
envoi duprodID
hashtagla source
Toutes les autres réponses fonctionneront sur la version Angular <6.1. Mais si vous avez la dernière version, vous n'aurez pas besoin de faire ces horribles hacks car Angular a résolu le problème.
voici le lien vers le problème
Tout ce que vous avez à faire est de définir
scrollOffset
l'option du deuxième argument deRouterModule.forRoot
méthode.la source
Utilisez ceci pour le module de routeur dans
app-routing.module.ts
:Ce sera dans votre HTML:
la source
Dans un fichier html:
Dans le fichier ts:
la source
Étant donné que la propriété de fragment ne fournit toujours pas de défilement d'ancrage, cette solution de contournement a fait l'affaire pour moi:
la source
En plus de la réponse de Kalyoyan , cet abonnement est lié au routeur et restera en ligne jusqu'à ce que la page soit complètement actualisée. Lorsque vous vous abonnez aux événements du routeur dans un composant, assurez-vous de vous désabonner dans ngOnDestroy:
la source
Je viens de le faire fonctionner sur mon propre site Web, alors j'ai pensé que cela valait la peine de publier ma solution ici.
Et puis dans votre composant, assurez-vous d'inclure ceci:
la source
element.scrollIntoView()
ouelement.scrollIntoView(true)
. Votre version ne s'est pas compilée pour moi (peut-être à cause de strictNullChecks?).Après avoir lu toutes les solutions, j'ai cherché un composant et j'en ai trouvé un qui fait exactement ce que la question initiale demandait: faire défiler pour ancrer les liens. https://www.npmjs.com/package/ng2-scroll-to
Lorsque vous l'installez, vous utilisez une syntaxe telle que:
Cela a très bien fonctionné pour moi.
la source
Une solution simple qui fonctionne pour les pages sans aucun paramètre de requête, est compatible avec le navigateur en arrière / en avant, le routeur et les liens profonds.
Le délai d'attente est simplement de permettre à la page de charger toutes les données dynamiques «protégées» par un * ngIf. Cela peut également être utilisé pour faire défiler vers le haut de la page lors du changement d'itinéraire - il suffit de fournir une balise d'ancrage supérieure par défaut.
la source
si cela n'a pas d'importance d'avoir ces identifiants d'élément ajoutés à l'URL, vous devriez envisager de jeter un œil à ce lien:
Angulaire 2 - Liens d'ancrage vers l'élément sur la page actuelle
la source
Voici une autre solution de contournement avec référence à la réponse JavierFuentes:
dans le script:
Cela permet à l'utilisateur de faire défiler directement jusqu'à l'élément, si l'utilisateur atterrit directement sur la page ayant le hashtag dans l'url.
Mais dans ce cas, je me suis abonné à la route Fragment in
ngAfterViewChecked
maisngAfterViewChecked()
est appelée en continu pour chaquengDoCheck
et cela ne permet pas à l'utilisateur de faire défiler vers le haut, doncrouteFragmentSubscription.unsubscribe
est appelée après un délai d'expiration de 0 millis après le défilement de la vue jusqu'à l'élément.De plus, une
gotoHashtag
méthode est définie pour faire défiler jusqu'à l'élément lorsque l'utilisateur clique spécifiquement sur la balise d'ancrage.Mettre à jour:
Si l'url a des chaînes de requêtes,
[routerLink]="['self-route', id]"
dans anchor ne conservera pas les chaînes de requêtes. J'ai essayé la solution de contournement suivante pour le même:la source
Celui-ci fonctionne pour moi !! Ce ngPour qu'il ancre dynamiquement la balise, vous devez attendre leur rendu
HTML:
Mon fichier ts:
N'oubliez pas d'importer ça
ViewChildren
,QueryList
etc. et ajoutez un constructeurActivatedRoute
!!la source
Contrairement à d' autres réponses que je voudrais en outre ajouter aussi
focus()
avecscrollIntoView()
. J'utilise aussisetTimeout
car il saute en haut sinon lors du changement d'URL. Je ne sais pas quelle était la raison de cela, mais il semblesetTimeout
que la solution de contournement.Origine:
Destination:
Manuscrit:
la source
J'ai eu le même problème. La solution: utiliser View Port Scroller https://angular.io/api/common/ViewportScroller#scrolltoanchor
- code app-routing.module.ts:
- HTML du composant
- Code du composant:
la source
Je viens de tester un plugin très utile disponible dans nmp - ngx-scroll-to , qui fonctionne très bien pour moi. Cependant, il est conçu pour Angular 4+, mais peut-être que quelqu'un trouvera cette réponse utile.
la source
J'ai essayé la plupart de ces solutions mais j'ai rencontré des problèmes de départ et de retour avec un autre fragment qui ne fonctionnait pas, alors j'ai fait quelque chose d'un peu différent qui fonctionne à 100% et me débarrasse du hachage laid dans l'URL.
tl; dr voici un meilleur moyen que ce que j'ai vu jusqu'à présent.
la source