J'utilise Angular's scrollTo
et anchorScroll
comme ceci:
app.controller('TestCtrl', function($scope, $location, $anchorScroll) { $scope.scrollTo = function(id) { $location.hash(id); $anchorScroll(); } }); <a ng-click="scrollTo('foo')">Foo</a> <div id="foo">Here you are</div>
Mon problème est que lorsque je clique sur le lien, la page défile vers le bas, mais dans 50% des cas, la page est rechargée car le hash change dans l'URL.
Comment puis-je empêcher Angular de recharger la page?
Mise à jour: j'ai trouvé que ici
Https://groups.google.com/forum/?fromgroups=#!msg/angular/BY2ekZLbnIM/MORF-z2vHnIJ
cette
The $location service broadcasts a $locationChangeStart event. You can observe that and call event.preventDefault() to stop the navigation. Nice!
Quelqu'un peut-il dire comment observer cet événement et prévenir le défaut
Le rafraîchissement se produit car il y a un appel à l'événement locationChangeStart. Vous pouvez arrêter ceci en faisant:
scope.$on('$locationChangeStart', function(ev) { ev.preventDefault(); });
J'ai fini par écrire ma propre directive scrollTo qui utilise cet appel à l'intérieur de celle-ci.
Plnkr / Github
Mon autre commentaire à propos de cela ici
Vous pouvez ajouter un paramètre $ event sur le gestionnaire ng-click:
<a ng-click="scrollTo('foo', $event)">Foo</a>
Et dans la fonction scrollTo vous pouvez faire la suivante:
scope.scrollTo = function(str, event) { event.preventDefault(); event.stopPropagation(); /** SOME OTHER LOGIC */ }
Mais cela signifie que vous devez analyser manuellement un tiret d'ancrage cible à partir d'un élément "a".
Je pense que cela peut vous aider
$scope.redirectTodiv = function(divname,event) { var id = $location.hash(); $location.hash(divname); $anchorScroll(); $location.hash(id); };
À partir de: https://stackoverflow.com/a/25930875/4138368
Cet événement est émis sur l'arborescence, de sorte que vous pouvez enregistrer un observateur en utilisant la méthode $on
.
$scope.$on('$locationChangeStart', function(ev) { ev.preventDefault(); });
Pour empêcher la page de recharger dans une ancre angulaire, ajoutez un attribut href vide.
<a href ng-click="scrollTo('foo')">Foo</a> OR <a href="" ng-click="scrollTo('foo')">Foo</a>