Les liens d'ancrage dans Angularjs?

est-il possible d'utiliser des liens d'ancrage avec Angularjs?

c'est-à-dire:

 <a href="#top">Top</a>
 <a href="#middle">Middle</a>
 <a href="#bottom">Bottom</a>

 <div name="top"></div>
 ...
 <div name="middle"></div>
 ...
 <div name="bottom"></div>

Merci

70
demandé sur drozzy 2012-12-25 03:43:47

11 réponses

Il ya quelques façons de le faire il me semble.

Option 1: Natif Angular

Angular fournit un service $anchorScroll , mais la documentation fait cruellement défaut et je n'ai pas été en mesure de la faire fonctionner.

Check out http://www.benlesh.com/2013/02/angular-js-scrolling-to-element-by-id.html pour un aperçu de $anchorScroll .

Option 2: Directive Personnalisée / Native JavaScript

une autre façon que j'AI testée était de créer une directive personnalisée et d'utiliser el.scrollIntoView() . Cela fonctionne assez décemment en faisant fondamentalement ce qui suit dans votre fonction de lien de directive:

var el = document.getElementById(attrs.href);
el.scrollIntoView();

cependant, il semble un peu exagéré de faire ces deux quand le navigateur soutient nativement ceci, non?

Option 3: Contrôleur Angulaire / Navigateur Natif

si vous regardez http://docs.angularjs.org/guide/dev_guide.services.$emplacement et sa section de réécriture de Lien HTML, vous verrez que les liens ne sont pas réécrits dans ce qui suit:

Liens qui contiennent de l'élément cible

exemple: <a href="/ext/link?a=b" target="_self">link</a>

donc, tout ce que vous avez à faire est d'ajouter l'attribut target à vos liens, comme ceci:

<a href="#anchorLinkID" target="_self">Go to inpage section</a>

Angulaire par défaut pour le navigateur et comme il s'agit d'un lien d'ancrage et non d'une url de base différente, le navigateur se déplace à l'endroit voulu.

je suis allé avec l'option 3 parce que son meilleur pour compter sur la fonctionnalité de navigateur natif ici, et nous économise du temps et de l'effort.

il faut noter qu'après un changement réussi de défilement et de hachage, Angular fait un suivi et réécrit le hachage à son style personnalisé. Toutefois, le navigateur a déjà terminé ses affaires et vous êtes bon pour aller.

98
répondu Courcelan 2013-08-22 06:19:05

Je ne sais pas si cela répond à votre question, mais oui, vous pouvez utiliser des liens angularjs, tels que:

<a ng-href="http://www.gravatar.com/avatar/{{hash}}"/>

il y a un bon exemple sur le site D'AngularJS:

http://docs.angularjs.org/api/ng.directive:ngHref

mise à jour: la documentation D'AngularJS était un peu obscure et n'offrait pas une bonne solution. Désolé!

vous pouvez trouver une meilleure solution ici: comment manipuler la liaison de hachage d'ancrage dans AngularJS

26
répondu Paola Cerioli 2017-05-23 12:10:09

vous pouvez essayer d'utiliser anchorScroll .

exemple

donc le contrôleur serait:

app.controller('MainCtrl', function($scope, $location, $anchorScroll, $routeParams) {
  $scope.scrollTo = function(id) {
     $location.hash(id);
     $anchorScroll();
  }
});

et la vue:

<a href="" ng-click="scrollTo('foo')">Scroll to #foo</a>

...et pas de secret pour l'anchor id:

<div id="foo">
  This is #foo
</div>
19
répondu Edmar Miyake 2013-10-24 02:27:44

$ anchorScroll est en effet la réponse à cela, mais il ya une bien meilleure façon de l'utiliser dans les versions plus récentes D'Angular.

maintenant, $ anchorScroll accepte le hachage comme argument optionnel, donc vous n'avez pas à changer $location.de hachage. ( documentation )

C'est la meilleure solution car elle n'affecte pas la route du tout. Je n'ai pas pu faire fonctionner les autres solutions parce que j'utilise ngRoute et le route rechargerait dès que j'aurais mis $location.hash(id) , avant que $anchorScroll ne puisse faire sa magie.

Voici comment l'utiliser... premièrement, dans la directive ou le contrôleur:

$scope.scrollTo = function (id) {
  $anchorScroll(id);  
}

et puis dans la vue:

<a href="" ng-click="scrollTo(id)">Text</a>

aussi, si vous avez besoin de tenir compte d'une barre de navigation fixe (ou D'une autre interface utilisateur), vous pouvez définir l'offset pour $ancherscroll comme ceci (dans la fonction d'exécution du module principal):

  .run(function ($anchorScroll) {
      //this will make anchorScroll scroll to the div minus 50px
      $anchorScroll.yOffset = 50;
  });
5
répondu Rebecca 2016-01-27 04:25:29

j'ai eu le même problème, mais cela a fonctionné pour moi:

<a ng-href="javascript:void(0);#tagId"></a>
1
répondu Leonardo Silva do Nascimento 2015-10-02 18:47:26

Fonctionne pour moi:

 <a onclick='return false;' href="" class="collapsed" role="button" data-toggle="collapse" data-parent="#accordion" ng-href="#profile#collapse{{$index}}"> blalba </a>
1
répondu Imran Omar Bukhsh 2015-12-09 18:17:48

il vous suffit d'ajouter target="_self" à votre lien

ex. <a href="#services" target="_self">Services</a>

1
répondu farzad.Kamali 2017-05-25 20:48:35

ou vous pouvez simplement écrire:

ng-href="\#yourAnchorId"

s'il vous Plaît notez la barre oblique inverse devant le symbole dièse

0
répondu Marko 2014-04-23 09:48:39

si vous utilisez SharePoint et angular puis le faire comme ci-dessous:

<a ng-href="{{item.LinkTo.Url}}" target="_blank" ng-bind="item.Title;" ></a> 

où LinkTo et le titre est la colonne SharePoint.

0
répondu Amay Kulkarni 2015-09-04 11:51:00

Le meilleur choix pour moi était de créer une directive pour faire le travail, parce que $location.hash() et $anchorScroll() détourner L'URL créant beaucoup de problèmes à mon itinéraire SPA.

MyModule.directive('myAnchor', function() {
  return {
    restrict: 'A',
    require: '?ngModel',
    link: function(scope, elem, attrs, ngModel) {
      return elem.bind('click', function() {
        //other stuff ...
        var el;
        el = document.getElementById(attrs['myAnchor']);
        return el.scrollIntoView();
      });      
    }
  };
});
0
répondu Márcio Marinho 2016-05-21 11:58:32

vous pouvez également naviguer à L'id HTML à partir de l'intérieur du contrôleur

$location.hash('id_in_html');
0
répondu vijay 2017-01-12 15:23:22