Est-ce que l'un d'entre vous sait comment bien gérer la liaison de hachage d'ancrage dans AngularJS ?
J'ai le balisage suivant pour une simple page FAQ
<a href="#faq-1">Question 1</a>
<a href="#faq-2">Question 2</a>
<a href="#faq-3">Question 3</a>
<h3 id="faq-1">Question 1</h3>
<h3 id="faq-2">Question 2</h3>
<h3 id="fa1-3">Question 3</h3>
Lorsque vous cliquez sur l'un des liens ci-dessus, AngularJS intercepte et m'achemine vers une page complètement différente (dans mon cas, une page de 404 car il n'y a pas d'itinéraires correspondant aux liens.)
Ma première pensée a été de créer un itinéraire correspondant " / faq /: chapitre " et dans le contrôleur correspondant, vérifier $routeParams.chapter
après un élément correspondant, puis utiliser jQuery pour y faire défiler.
Mais AngularJS me chie encore une fois et fait quand même défiler vers le haut de la page.
Donc, quelqu'un ici a fait quelque chose de similaire dans le passé et connaît une bonne solution?
Edit: Passer à html5Mode devrait résoudre mes problèmes, mais nous devons en quelque sorte prendre en charge IE8 +, donc je crains que ce ne soit pas une solution acceptée: /
la source
ng-href=""
place.Réponses:
Vous cherchez
$anchorScroll()
.Voici la documentation (merde).
Et voici la source.
Fondamentalement, il vous suffit de l'injecter et de l'appeler dans votre contrôleur, et il vous fera défiler jusqu'à n'importe quel élément avec l'ID trouvé dans
$location.hash()
Voici un plongeur pour démontrer
EDIT: pour l'utiliser avec le routage
Configurez votre routage angulaire comme d'habitude, puis ajoutez simplement le code suivant.
et votre lien ressemblerait à ceci:
Voici un Plunker démontrant le défilement avec le routage et $ anchorScroll
Et encore plus simple:
et votre lien ressemblerait à ceci:
la source
<a href="#foo">foo</a>
. Mon exemple de code devait montrer le défilement vers un identifiant lors du changement de routage.$location.search('scrollTo', null)
Dans mon cas, j'ai remarqué que la logique de routage se déclenchait si je modifiais le
$location.hash()
. L'astuce suivante a fonctionné ..la source
$location.hash(my_id); $anchorScroll; $location.hash(null)
. Il empêche le rechargement et je n'ai pas à gérer laold
variable.Il n'est pas nécessaire de modifier le routage ou tout autre élément à utiliser
target="_self"
lors de la création des liensExemple:
Et utilisez l'
id
attribut dans vos éléments html comme ceci:Il n'est pas nécessaire d'utiliser ## comme indiqué / mentionné dans les commentaires ;-)
la source
la source
Si vous connaissez toujours l'itinéraire, vous pouvez simplement ajouter l'ancre comme ceci:
où
route
est l'itinéraire angulaire actuel etanchorID
correspond à<a id="anchorID">
quelque part sur la pagela source
reloadOnSearch: false
pour cet itinéraire dans votre configuration d'itinéraires, angular ne déclenchera pas de changement d'itinéraire et fera simplement défiler jusqu'à l'id. En combinaison avec l'itinéraire complet spécifié dans laa
balise, je dirais que c'est la solution la plus simple et la plus directe.$anchorScroll
fonctionne pour cela, mais il existe une bien meilleure façon de l'utiliser dans les versions plus récentes d'Angular.Maintenant,
$anchorScroll
accepte le hachage comme argument facultatif, vous n'avez donc pas à changer$location.hash
du tout. ( documentation )C'est la meilleure solution car elle n'affecte pas du tout l'itinéraire. Je n'ai pu faire fonctionner aucune des autres solutions car j'utilise ngRoute et la route se rechargerait dès que j'aurais défini
$location.hash(id)
, avant de$anchorScroll
pouvoir faire sa magie.Voici comment l'utiliser ... d'abord, dans la directive ou le contrôleur:
puis dans la vue:
De plus, si vous devez tenir compte d'une barre de navigation fixe (ou d'une autre interface utilisateur), vous pouvez définir le décalage pour $ anchorScroll comme ceci (dans la fonction d'exécution du module principal):
la source
id
dans cette vue.ngRoute
la nouvelle version d'Angular.C'était ma solution en utilisant une directive qui semble plus angulaire-y parce que nous avons affaire au DOM:
Plnkr ici
github
CODE
HTML
J'ai utilisé le service $ anchorScroll. Pour contrer l'actualisation de la page qui accompagne le changement de hachage, j'ai continué et annulé l'événement locationChangeStart. Cela a fonctionné pour moi car j'avais une page d'aide connectée à un ng-switch et les rafraîchissements briseraient essentiellement l'application.
la source
Essayez de définir un préfixe de hachage pour les itinéraires angulaires
$locationProvider.hashPrefix('!')
Exemple complet:
la source
J'ai contourné cela dans la logique de l'itinéraire pour mon application.
la source
Ceci est un ancien poste, mais j'ai passé beaucoup de temps à rechercher diverses solutions, donc je voulais en partager une plus simple. Le simple ajout
target="_self"
à la<a>
balise l'a corrigé pour moi. Le lien fonctionne et m'amène au bon endroit sur la page.Cependant, Angular injecte toujours un peu de bizarrerie avec le # dans l'URL, vous pouvez donc rencontrer des problèmes en utilisant le bouton de retour pour la navigation et autres après avoir utilisé cette méthode.
la source
Il s'agit peut-être d'un nouvel attribut pour ngView, mais j'ai pu obtenir des liens de hachage d'ancrage avec lesquels
angular-route
utiliser l'ngView autoscroll
attribut et les «doubles hachages».ngView (voir défilement automatique)
(Le code suivant a été utilisé avec une sangle angulaire)
la source
Je pourrais faire ça comme ça:
la source
Voici une sorte de solution de contournement en créant une directive personnalisée qui défilera jusqu'à l'élément spécifié (avec une "FAQ" codée en dur)
http://plnkr.co/edit/Po37JFeP5IsNoz5ZycFs?p=preview
la source
$anchorScroll
, voir ma réponse.la source
Si vous n'aimez pas utiliser,
ng-click
voici une autre solution. Il utilise unfilter
pour générer l'URL correcte en fonction de l'état actuel. Mon exemple utilise ui.router .L'avantage est que l'utilisateur verra où le lien passe en survol.
Le filtre:
la source
Ma solution avec ng-route était cette simple directive:
Le html ressemble à:
la source
scroll-to="yourid"
et de nommer la directivescrollTo
(et d'accéder à l'attribut commeattrs["scrollTo"]
? De plus, sans inclusion explicite de jQuery, le gestionnaire doit être liéelement.on('click', function (e) {..})
.Vous pouvez essayer d'utiliser anchorScroll .
Exemple
Le contrôleur serait donc:
Et la vue:
... et pas de secret pour l'identifiant de l'ancre:
la source
J'essayais de faire défiler mon application angulaire jusqu'à un chargement d'opon d'ancrage et j'ai rencontré les règles de réécriture d'URL de $ routeProvider.
Après une longue expérimentation, je me suis installé sur ceci:
la source
Je ne suis pas sûr à 100% si cela fonctionne tout le temps, mais dans mon application, cela me donne le comportement attendu.
Disons que vous êtes sur la page À PROPOS et que vous avez l'itinéraire suivant:
Maintenant, en vous HTML
En conclusion
L'inclusion du nom de la page avant l'ancre a fait l'affaire pour moi. Faites-moi part de vos pensées.
Inconvénient
Cela restituera la page, puis défilera jusqu'à l'ancre.
METTRE À JOUR
Une meilleure façon consiste à ajouter ce qui suit:
la source
Obtenez facilement votre fonction de défilement. Il prend également en charge le défilement animé / lisse en tant que fonctionnalité supplémentaire. Détails pour la bibliothèque de défilement angulaire :
Github - https://github.com/oblador/angular-scroll
Bower :
bower install --save angular-scroll
npm :
npm install --save angular-scroll
Version minfied - seulement 9kb
Défilement fluide (défilement animé) - oui
Scroll Spy - oui
Documentation - excellente
Démo - http://oblador.github.io/angular-scroll/
J'espère que cela t'aides.
la source
Sur la base de @Stoyan, j'ai trouvé la solution suivante:
la source
Lors du changement d'itinéraire, il défile en haut de la page.
mettez ce code sur votre manette.
la source
Dans mon esprit, @slugslog l'avait, mais je changerais une chose. J'utiliserais plutôt replace pour ne pas avoir à le remettre en place.
Recherche de documents pour la «méthode de remplacement»
la source
Aucune des solutions ci-dessus ne fonctionne pour moi, mais je viens de l'essayer, et cela a fonctionné,
J'ai donc réalisé que je devais notifier la page pour commencer par la page d'index, puis utiliser l'ancre traditionnelle.
la source
Parfois, dans angularjs, la navigation par hachage ne fonctionne pas et les bibliothèques javery bootstrap jquery utilisent largement ce type de navigation, pour le faire fonctionner, ajouter
target="_self"
à la balise d'ancrage. par exemple<a data-toggle="tab" href="#id_of_div_to_navigate" target="_self">
la source
Voir https://code.angularjs.org/1.4.10/docs/api/ngRoute/provider/ $ routeProvider
Définir ce paramètre sur faux a fait l'affaire sans tout ce qui précède pour moi.
la source
J'utilise AngularJS 1.3.15 et on dirait que je n'ai rien à faire de spécial.
https://code.angularjs.org/1.3.15/docs/api/ng/provider/ $ anchorScrollProvider
Donc, ce qui suit fonctionne pour moi dans mon html:
Je n'ai pas du tout dû apporter de modifications à mon contrôleur ou à JavaScript.
la source