href überschreibt ng-click in Angular.js


118

Wenn beide href- und ng-click-Attribute definiert sind:

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

Das hrefAttribut hat Vorrang vor ng-click.

Ich suche nach einer Möglichkeit, die Priorität von ng-click zu erhöhen.

href wird für Twitter Bootstrap benötigt, ich kann es nicht entfernen.


Könnten Sie näher auf "href ist für Twitter Bootstrap erforderlich" eingehen? Welcher Teil davon? CSS oder JavaScript?
pkozlowski.opensource

Das Twitter-Bootstrap-Navigations-Widget ist so eingerichtet, dass Links verwendet werden. Wenn Sie eine Schaltfläche hinzufügen, die selbst so gestaltet ist, dass sie wie ein Link aussieht, wird das Design der Navigation beeinträchtigt. Es ist wahrscheinlich kein semantisches HTML, aber die Lösung von @ scalefemme macht das, was ich (und wahrscheinlich Paul) möchte.
BenCr

Ignorieren Sie alles, was ich gesagt habe. Die Navigationsleiste funktioniert perfekt mit Schaltflächen, wenn Sie das richtige HTML und die richtigen Klassen verwenden. getbootstrap.com/components/#navbar
BenCr

Sie sollten die Antwort von Mithu akzeptieren, die darin besteht, eine leere URL zu verwenden
Peter Morris

1
@Paul Das Originalposter fragte, wie man ein <a href> dazu bringt, nicht zu navigieren. Die akzeptierte Antwort besagt, dass Sie zu einer Schaltfläche wechseln sollen. Obwohl das funktioniert, ist es nicht die Lösung für das Problem, besonders wenn Sie wie ich gezwungen sind, <a href> zu verwenden, weil es ein Bootstrap-Menü oder so ist. Die richtige Lösung für diese spezielle Frage besteht darin, eine leere URL zu verwenden. <a href="" ng-click="whatever()"> Abmelden </a> - Ich habe sie getestet und kann bestätigen, dass sie funktioniert. Zum Glück hat jemand anderes die richtige Antwort gegeben, sonst stecke ich immer noch fest.
Peter Morris

Antworten:


35

Sie sollten wahrscheinlich nur ein Button-Tag verwenden, wenn Sie keinen Uri benötigen.


Ja, wenn Sie näher erläutern können, wie Twitter Bootstrap dies erfordert, kann ich vielleicht mehr helfen.
Geoff

Wie funktioniert das mit Suchmaschinen? Ich verwende AngularJS-Routing und muss den Status in einem Dienst beibehalten. Daher verwende ich für alle meine internen Anwendungslinks $ location, aber das Entfernen von href macht es Suchmaschinen unmöglich, der Site zu folgen.
Darrrrrren

2
Schaltflächen können kein anderes Element enthalten. Für das Styling möchten Sie dies also nicht tun - wenn Sie Dinge darin benötigen.
Sheriffderek

246

In diesem Beispiel von der Website für eckige Dokumentation müssen hrefSie es nur einer leeren Zeichenfolge zuweisen:

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

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


3
Wenn ich das versuche, scheinen alle Links besucht zu sein, was nicht das Verhalten ist, nach dem ich suche. Der andere Weg ( href="#") bewirkt ein erneutes Laden der Seite, was ebenfalls falsch ist.
Rhys van der Waerden

4
Dadurch zeigt IE9 keinen Handcursor an. Verwenden href=""löst es.
Juampy NR

1
@juampy, die Übergabe des Links kann mit CSS erfolgen. Diese Antwort ist die offizielle Methode von AngularJS.
thenetimp

Das # wird wie ein Hash-Link behandelt.
Sheriffderek

3
<a href="javscript:void(0)" ng-click="logout()">Sign out</a>wird Ihnen auch gut dienen
Marios Fakiolas

88

Sie können das Standardverhalten des Klickereignisses einfach direkt in Ihrer Vorlage verhindern.

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

Per den Winkellagen ,

Anweisungen wie ngClick und ngFocus machen ein $ event-Objekt im Rahmen dieses Ausdrucks verfügbar.


11
Dies ist eine großartige Lösung. Wenn Sie eine href haben, können Sie mit der rechten Maustaste darauf klicken, um sie in einem neuen Tab zu öffnen. Wenn Sie mit der linken Maustaste darauf klicken, wird ng-click aufgerufen. Genau das, wonach ich gesucht habe
Tom Grant

Wieder eine hervorragende Antwort. Sowohl Links- als auch Rechtsklick funktionieren
Jay Jay Jay

Hervorragend geeignet, um Bootstrap-Karussellsteuerungen zuzulassen, ohne das Routing auszulösen. Vielen Dank!
Jason Maggard

Perfekt! Ich kann mit Links fortfahren und mehr Index in Google erhalten und mit ng-click Ajax aufrufen. Vielen Dank.
Guilherme IA

Tolle Lösung, schnell und nützlich. Vielen Dank!
Josue Rocha

72

Hier ist eine andere Lösung:

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

dh einfach das # aus dem href-Attribut entfernen


1
Für die gestellte Frage sollte dies die Lösung sein. Arbeitete auch an Angular 1.1.5
Sindre

18
Es scheint, dass <a href="" ng-click=""> den ng-Klick im Android 2.3.x-Browser verhindert. Ich benutze endlich <a href="javascript:void(0)" ng-click="">
duckegg

1
Duckeggs Vorschlag ist der beste
Jiří Vypědřík

26

Nur noch ein Hinweis. Wenn Sie eine echte URL benötigen (um die Zugänglichkeit des Browsers zu unterstützen), können Sie Folgendes tun:

Vorlage:

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

Richtlinie:

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

Auf diese Weise kann Ihr Code in linkClicked () ausgeführt werden, bevor Sie zum Link navigieren


Diese Lösung funktioniert und ändert nur das Linksklickverhalten. Der Rechtsklick bleibt erhalten (Kontextmenü), einschließlich der Möglichkeit zu einem Link in href. Das ist also eine allgemeinere Lösung im Vergleich zu TooMuchTenacious, das die Frage tatsächlich direkter beantwortet.
Exocom

21

In Angular sind <a>s Direktiven . Wenn Sie eine leere hrefoder keine haben href, ruft Angular an event.preventDefault.

Aus der Quelle :

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

Hier ist ein Plnkr , der das fehlende hrefSzenario demonstriert .


13

Dies funktionierte für mich in IE 9 und AngularJS v1.0.7:

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

Vielen Dank an duckeggs 'Kommentar für die funktionierende Lösung!


Funktioniert, der Link ändert Ihre URL nicht und wird nicht als besucht markiert. Beste Antwort!
Jim109

10

Es gibt hier so viele Antworten auf diese Frage, aber es scheint ein wenig Verwirrung darüber zu geben, was hier tatsächlich vor sich geht.

Erstens Ihre Prämisse

"href überschreibt ng-click in Angular.js"

ist falsch. Was tatsächlich passiert, ist, dass das Klickereignis nach dem Klicken zuerst von eckig (definiert durch die ng-clickDirektive in eckigem 1.x und clickin eckigem 2.x +) behandelt wird und sich dann weiter ausbreitet (was den Browser schließlich dazu veranlasst, zu navigieren) URL mit hrefAttribut definiert ). (Siehe dies zur Ereignisverbreitung in Javascript finden Sie hier)

Wenn Sie dies vermeiden wollen, dann sollten Sie die Ereignispropagierung mit der abbrechen Event - Schnittstelle des preventDefault()Verfahrens :

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

(Dies ist reine Javascript-Funktionalität und hat nichts mit Winkel zu tun.)

Dies wird Ihr Problem bereits lösen, aber dies ist nicht die optimale Lösung. Angular fördert zu Recht das MVC-Muster . Bei dieser Lösung wird Ihre HTML-Vorlage mit der Javascript-Logik gemischt. Sie sollten versuchen, dies so weit wie möglich zu vermeiden und Ihre Logik in Ihren Winkelregler zu integrieren. Ein besserer Weg wäre also

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

Und in Ihrer logout () -Methode:

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

Jetzt erreicht das Klickereignis den Browser nicht mehr und versucht nicht, den Link zu laden, auf den verwiesen wird href. (Beachten Sie jedoch, dass, wenn der Benutzer mit der rechten Maustaste auf den Link klickt und den Link direkt öffnet, überhaupt kein Klickereignis auftritt. Stattdessen wird die URL, auf die das hrefAttribut zeigt, direkt geladen .)

Zu den Kommentaren zur besuchten Linkfarbe in den Browsern. Auch dies hat nichts mit Winkel zu tun. Wenn Sie href="..."standardmäßig auf eine von Ihrem Browser besuchte URL verweisen, ist die Linkfarbe unterschiedlich. Dies wird durch CSS gesteuert : Selector besucht . Sie können Ihr CSS ändern, um dieses Verhalten zu überschreiben:

a {
   color:pink;
}

PS1 :

Einige Antworten empfehlen:

<a href .../>

hrefist eine Winkelrichtlinie. Wenn Ihre Vorlage im Winkel verarbeitet wird, wird diese in konvertiert

<a href="" .../>

Diese beiden Wege sind im Wesentlichen gleich.


5

Schreiben Sie einfach ng-click vor href .. Es hat bei mir funktioniert

<!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>


2

Ich glaube nicht, dass Sie "#" aus href entfernen müssen. Folgende Arbeiten mit Angularjs 1.2.10

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

1

Sie können dies auch versuchen:

<div ng-init="myVar = 'www.thesoftdesign'">
        <h1>Tutorials</h1>
        <p>Go to <a ng-href="{{myVar}}">{{myVar}}</a> to learn!</p>
</div>

0

Ich werde für Sie ein Beispiel hinzufügen, das für mich funktioniert, und Sie können es ändern, wie Sie möchten.

Ich füge den folgenden Code in meinen Controller ein.

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

und für meine Ansichtsseite füge ich den folgenden Code hinzu.

<a  href="" ng-model="showNumber" ng-click="showNumberFct()" ng-init="showNumber = false" >Click Me!!!</a>

0

Haben Sie versucht, innerhalb der Abmeldefunktion selbst umzuleiten? Angenommen, Ihre Abmeldefunktion lautet wie folgt

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

Dann können Sie einfach haben

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

0

Bitte prüfen Sie das

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

 $scope.logout = function(event)


 {
event.preventDefault();
alert("working..");
}

0
//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>

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.