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.

Paul
quelle
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.

Geoff
quelle
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

Homan
quelle
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.

atroberts20
quelle
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

Muhammad Towfique Imam
quelle
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

mPrinC
quelle
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 .

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

Harmon
quelle
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.

Caner
quelle
5

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

<!DOCTYPE html>
<html>

  <head>
    <script data-require="[email protected]" 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>

Anna
quelle
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>
Saurabh
quelle
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>
Rizo
quelle
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>
BERGUIGA Mohamed Amine
quelle
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>
strizzwald
quelle
0

Bitte prüfen Sie das

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

 $scope.logout = function(event)


 {
event.preventDefault();
alert("working..");
}
Ajay Malhotra
quelle
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>
Krishna
quelle
0

Das funktioniert bei mir

<a href (click)="logout()">
   <i class="icon-power-off"></i>
   Logout
</a>
Soukaina Benchekroun
quelle