href l'emporte sur ng-click en angle.js

lorsque les deux attributs HREF et ng-click sont définis:

<a href="#" ng-click="logout()">Sign out</a>

l'attribut href a priorité sur ng-click.

je cherche un moyen d'augmenter la priorité de ng-click.

href est nécessaire pour Bootstrap Twitter, Je ne peux pas l'enlever.

98
demandé sur Paul 2013-02-18 19:10:12

15 réponses

vous devriez probablement juste utiliser une étiquette de bouton si vous n'avez pas besoin d'un uri.

29
répondu Geoff 2013-02-18 16:05:41

cet exemple du site de documentation angulaire ne fait que href sans même l'assigner à une chaîne vide:

[<a href ng-click="colors.splice($index, 1)">X</a>]

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

235
répondu Homan 2013-08-26 18:06:02

, Vous pouvez simplement empêcher le comportement par défaut de l'événement de clic directement dans votre modèle.

<a href="#" ng-click="$event.preventDefault();logout()" />

Par le angulaire de la documentation ,

Les Directives

comme ngClick et ngFocus exposent un objet $event dans le cadre de cette expression.

71
répondu atroberts20 2014-09-18 22:35:00

Voici une autre solution:

<a href="" ng-click="logout()">Sign out</a>

i.e. il suffit de supprimer le # de l'attribut href

68
répondu Muhammad Towfique Imam 2013-04-03 18:07:44

encore un indice. Si vous avez besoin de L'URL réelle (pour soutenir l'accessibilité du navigateur), vous pouvez faire ce qui suit:

modèle:

<a ng-href="{{link}}" ng-click="$event.preventDefault(); linkClicked(link)">{{link}}</a>

directive:

$scope.linkClicked = function(link){
    // your code here
    $location.path(link);
};

de cette façon, votre code dans linkClicked() aura la chance de s'exécuter avant de naviguer vers le lien

23
répondu mPrinC 2014-11-18 23:22:04

en angle, <a> s sont des directives . Par conséquent , si vous avez un href ou un href vide, Angular appellera event.preventDefault .

De la source :

    element.on('click', function(event){
      // if we have no href url, then don't navigate anywhere.
      if (!element.attr(href)) {
        event.preventDefault();
      }
    });

voici un plnkr démontrant le scénario manquant href .

20
répondu pdoherty926 2014-12-09 20:08:55

cela a fonctionné pour moi dans IE 9 et AngularJS v1.0.7:

<a href="javascript:void(0)" ng-click="logout()">Logout</a>

merci à commentaire de duckeggs pour la solution de travail!

12
répondu Harmon 2017-05-23 11:54:53

il suffit d'écrire ng-click avant href ..il a fonctionné pour moi

<!DOCTYPE html>
<html>

  <head>
    <script data-require="angular.js@1.5.0" data-semver="1.5.0" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.0/angular.js"></script>
    <script>
    angular.module("module",[])
.controller("controller",function($scope){
  
  $scope.func =function(){
    console.log("d");
  }
  
})</script>
  </head>

  <body ng-app="module" ng-controller="controller">
    <h1>Hello ..</h1>
    <a ng-click="func()" href="someplace.html">Take me there</a>
  </body>

</html>
5
répondu Anna 2017-03-08 09:20:48

il y a tellement de réponses à cette question ici, mais il semble qu'il y ait un peu de confusion sur ce qui se passe réellement ici.

tout D'abord, votre prémisse

"href remplace ng-cliquez sur Angulaire.js "

est faux. Ce qui se passe réellement est qu'après votre clic, l'événement de clic est d'abord manipulé par angulaire(défini par la directive ng-click dans angulaire 1.x et click en angle 2.x+) et ensuite il continue à se propager(ce qui déclenche éventuellement le navigateur pour naviguer à l'url définie avec href attribut).(Voir ce pour en savoir plus sur la propagation de l'évènement en javascript)

si vous voulez éviter cela, alors vous devriez annuler la propagation de l'événement en utilisant la méthode de l'interface D'événement preventDefault() :

<a href="#" ng-click="$event.preventDefault();logout()" />

(C'est la fonctionnalité javascript pure et rien à voir avec angular)

Maintenant, ce sera déjà résoudre votre problème, mais ce n'est pas la solution optimale. Angular, à juste titre, favorise le MVC pattern . Avec cette solution, votre modèle html est mélangé à la logique javascript. Vous devriez essayer d'éviter cela autant que possible et mettre votre logique dans votre contrôleur angulaire. Donc une meilleure façon serait

<a href="#" ng-click="logout($event)" />

Et dans votre méthode logout ():

logout($event) {
   $event.preventDefault();
   ...
}

maintenant l'événement de clic n'atteindra pas le navigateur, de sorte qu'il n'essayera pas de charger le lien pointé par href . (Notez cependant que si l'utilisateur clique droit sur le lien et ouvre directement le lien, alors il n'y aura pas d'événement de clic du tout. Au lieu de cela, il chargera directement l'url pointée par l'attribut href .)

concernant les commentaires sur la couleur du lien visité dans les navigateurs. A nouveau, il existe rien à voir avec angular, si votre href="..." pointe vers une url consultée par votre navigateur par défaut, la couleur du lien sera différente. Ceci est contrôlé par CSS: sélecteur visité , vous pouvez modifier votre css pour outrepasser ce comportement:

a {
   color:pink;
}

PS1 :

Certaines réponses suggèrent d'utiliser:

<a href .../>

href est une directive angulaire. Lorsque votre modèle est traité par angulaire ce sera converti en

<a href="" .../>

ces deux voies sont essentiellement les mêmes.

5
répondu Caner 2017-12-19 17:01:47

je ne pense pas que vous avez besoin pour enlever le "#" de href. Travaux ultérieurs avec Angularjs 1.2.10

<a href="#/" ng-click="logout()">Logout</a>
2
répondu Saurabh 2014-02-11 19:22:45

vous pouvez aussi essayer ceci:

<div ng-init="myVar = 'www.thesoftdesign'">
        <h1>Tutorials</h1>
        <p>Go to <a ng-href="{{myVar}}">{{myVar}}</a> to learn!</p>
</div>
1
répondu Rizo 2018-04-27 10:26:52

je vais ajouter pour vous un exemple qui fonctionne pour moi et vous pouvez le changer comme vous voulez.

j'ajoute le code bellow dans mon contrôleur.

     $scope.showNumberFct = function(){
        alert("Work!!!!");
     }

et pour ma page de vue j'ajoute le code ci-dessous.

<a  href="" ng-model="showNumber" ng-click="showNumberFct()" ng-init="showNumber = false" >Click Me!!!</a>
0
répondu BERGUIGA Mohamed Amine 2015-05-17 14:22:29

avez-vous essayé la redirection à l'intérieur de la fonction de déconnexion elle-même? Par exemple, disons que votre fonction de déconnexion est comme suit:

$scope.logout = function()
{
  $scope.userSession = undefined;
  window.location = "http://www.yoursite.com/#"
}

alors vous pouvez juste avoir

<a ng-click="logout()">Sign out</a>
0
répondu strizzwald 2016-07-14 10:13:49

s'il vous Plaît vérifier cette

<a href="#" ng-click="logout(event)">Logout</a>

 $scope.logout = function(event)


 {
event.preventDefault();
alert("working..");
}
0
répondu Ajay Malhotra 2016-09-27 15:16:49
//for dynamic elements - if you want it in ng-repeat do below code

angular.forEach($scope.data, function(value, key) {
     //add new value to object
    value.new_url  = "your url";
});

 <div ng-repeat="row in data"><a ng-href="{{ row.url_content }}"></a></div>
0
répondu Krishna 2017-01-31 10:26:22