href, Angular.js'de ng-tıklamayı geçersiz kılar


118

Hem href hem de ng-tıklama özellikleri tanımlandığında:

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

hrefnitelik ng tıklama önceliklidir.

Ng tıklama önceliğini artırmanın bir yolunu arıyorum.

href Twitter Bootstrap için gerekli, kaldıramıyorum.


"Twitter Bootstrap için href gereklidir" konusundan biraz bahsedebilir misiniz? Hangi kısmı? CSS mi JavaScript mi?
pkozlowski.opensource

Twitter Bootstrap nav "pencere öğesi" bağlantıları kullanmak için ayarlanmıştır, eğer ona bir düğme eklerseniz, bir bağlantı gibi görünecek şekilde tasarlanmış olsa bile gezinmenin stilini bozar. Muhtemelen anlamsal HTML değil ama @ sketchfemme'nin çözümü benim (ve muhtemelen Paul'un) yapmasını istediğim şeyi yapıyor.
BenCr

Söylediğim her şeyi görmezden gelin, doğru HTML ve sınıfları kullanırsanız navbar düğmelerle mükemmel şekilde çalışır. getbootstrap.com/components/#navbar
BenCr

Boş bir URL kullanmak için Mithu'nun yanıtını kabul etmelisiniz
Peter Morris

1
@Paul Orijinal gönderen, gezinmemek için nasıl <a href> alınacağını sordu. Kabul edilen cevap, bir düğmeye geçmenizi söylüyor. Bu işe yarasa da, sorunun çözümü değil, özellikle de benim gibi <a href> kullanmak zorunda kalıyorsunuz çünkü bu bir önyükleme menüsü veya başka bir şey. Bu özel sorunun doğru çözümü boş bir url kullanmaktır <a href="" ng-click="whatever()"> Çıkış </a> - Test ettim ve çalıştığını onaylayabilirim. Neyse ki başka biri doğru cevabı verdi, yoksa yine de takılıp kalırdım.
Peter Morris

Yanıtlar:


35

Bir uri'ye ihtiyacınız yoksa muhtemelen bir düğme etiketi kullanmalısınız.


Evet, Twitter Bootstrap'in bunu nasıl gerektirdiğini açıklayabilirseniz, belki daha fazla yardımcı olabilirim.
Geoff

Bu arama motorlarında nasıl çalışır? AngularJS yönlendirmesini kullanıyorum ve bir hizmetteki durumu sürdürmem gerekiyor, bu nedenle tüm dahili uygulama bağlantılarım için $ location kullanıyorum, ancak href'i kaldırmak arama motorlarının site boyunca izlemesini imkansız hale getiriyor.
Darrrrrren

2
düğmelerin içinde başka öğeler olamaz, bu yüzden stil için, bunu yapmak istemezsiniz - eğer içinde bir şeye ihtiyacınız varsa.
sheriffderek

246

Açısal dokümantasyon sitesinden alınan bu örnek, hrefonu boş bir dizeye bile atamadan yapar :

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

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


3
Bunu denediğimde tüm bağlantılar ziyaret edilmiş gibi görünüyor, bu benim peşinde olduğum davranış değil. Diğer yol ( href="#") sayfanın yeniden yüklenmesine neden olur, bu da yanlıştır.
Rhys van der Waerden

4
Bu, IE9'un bir el imlecini göstermemesini sağlar. Kullanmak href=""onu çözer.
Juampy NR

1
@juampy, bağlantının teslim edilmesi CSS ile işlenebilir. Verilen bu cevap, bunu yapmanın resmi AngularJS yoludur.
thenetimp

#, Karma bağlantı olarak değerlendirilecektir.
sheriffderek

3
<a href="javscript:void(0)" ng-click="logout()">Sign out</a>sana da iyi hizmet edecek
Marios Fakiolas

88

Tıklama olayının varsayılan davranışını doğrudan şablonunuzdan engelleyebilirsiniz.

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

Başına açısal belgeler ,

NgClick ve ngFocus gibi yönergeler, bu ifade kapsamında bir $ olay nesnesini ortaya çıkarır.


11
Bu harika bir çözüm. Bir href'iniz varsa, onu yeni bir sekmede açmak için sağ tıklayabilirsiniz, ancak sol tıkladığınızda ng-tıklama çağırır. Tam olarak aradığım şey
Tom Grant

Bir kez daha mükemmel bir cevap. Hem sol hem de sağ tıklama çalışır
Jay Jay Jay

Yönlendirmeyi tetiklemeden Bootstrap atlıkarınca kontrollerine izin vermek için harika çalıştı. Teşekkürler!
Jason Maggard

Mükemmel! Bağlantılarla devam edebilir ve Google'da daha fazla indeks alabilir ve Ajax'ta aramak için ng-tıklama kullanabilirim. Teşekkürler.
Guilherme IA

Harika çözüm, hızlı ve kullanışlı. Teşekkürler!
Josue Rocha

72

İşte başka bir çözüm:

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

ör. href özelliğinden # işaretini kaldırın


1
Sorulan soru için çözüm bu olmalı. Angular
1.1.5'te

18
Görünüşe göre <a href="" ng-click=""> Android 2.3.x tarayıcısında ng-tıklamayı engelleyecek. Sonunda <a href="javascript:void(0)" ng-click="">
duckegg

1
Duckegg'in önerisi en iyisi
Jiří Vypědřík

26

Sadece bir ipucu daha. Gerçek URL'ye ihtiyacınız varsa (tarayıcı erişilebilirliğini desteklemek için) aşağıdakileri yapabilirsiniz:

şablonu:

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

direktif:

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

Bu şekilde, linkClicked () içindeki kodunuzun bağlantıya gitmeden önce çalıştırma şansı olacaktır.


Bu çözüm çalışır ve yalnızca sol tıklama davranışını değiştirir; sağ tıklama, href içindeki bir bağlantı olasılığı dahil olmak üzere bozulmadan kalır (bağlam menüsü). Bu, aslında soruyu daha doğrudan yanıtlayan TooMuchTenacious'e kıyasla daha genel bir çözümdür.
Exocom

21

Angular'da <a>s yönergelerdir . Bu nedenle, boş bir yeriniz varsa hrefveya yoksa href, Angular arayacaktır event.preventDefault.

Gönderen kaynağı :

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

İşte eksik senaryoyu gösteren bir plnkrhref .


13

Bu benim için IE 9 ve AngularJS v1.0.7'de çalıştı:

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

Duckeggs'in çalışma çözümü için yorumuna teşekkürler !


Çalışır, bağlantı url'nizi değiştirmez ve ziyaret edildi olarak işaretlenmez. En iyi cevap!
Jim109

10

Burada bu sorunun pek çok cevabı var ama görünüşe göre burada gerçekte neler olup bittiğine dair biraz kafa karışıklığı var.

İlk olarak, öncülünüz

"href, Angular.js'de ng-tıklamayı geçersiz kılar"

Hata. Gerçekte olan şey, tıklamanızdan sonra, tıklama olayının ilk olarak açısal ( ng-clickaçısal 1.x ve clickaçısal 2.x + yönerge ile tanımlanmıştır) tarafından ele alınması ve daha sonra yayılmaya devam etmesidir (bu da sonunda tarayıcıyı, ile tanımlanmış url hrefözniteliği). (bakınız bu ) javaScript olay yetiştiriciliği daha fazla

Bundan kaçınmak istiyorsanız, Olay arayüzünün preventDefault()yöntemini kullanarak olay yayılımını iptal etmelisiniz :

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

(Bu saf javascript işlevselliğidir ve açısal ile ilgisi yoktur)

Şimdi, bu zaten sorununuzu çözecektir, ancak bu optimal çözüm değildir. Açısal, haklı olarak, MVC modelini destekler . Bu çözüm ile html şablonunuz javascript mantığıyla karıştırılır. Bundan mümkün olduğunca kaçınmaya çalışmalı ve mantığınızı açısal denetleyicinize yerleştirmelisiniz. Yani daha iyi bir yol

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

Ve logout () yönteminizde:

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

Artık tıklama olayı tarayıcıya ulaşmayacağı için işaret ettiği bağlantıyı yüklemeye çalışmayacaktır href. (Bununla birlikte, kullanıcı bağlantıyı sağ tıklar ve doğrudan bağlantıyı açarsa, o zaman bir tıklama etkinliği olmayacağını unutmayın. Bunun yerine, tarafından gösterilen URL'yi doğrudan yükleyecektir.href özniteliğin .)

Tarayıcılarda ziyaret edilen bağlantı rengi hakkındaki yorumlarla ilgili olarak. Yine bunun açısal ile ilgisi yoktur href="...", tarayıcınız tarafından ziyaret edilen bir url'ye işaret ederseniz, varsayılan olarak bağlantı rengi farklı olacaktır. Bu, CSS: ziyaret Seçici tarafından kontrol edilir , bu davranışı geçersiz kılmak için css'nizi değiştirebilirsiniz:

a {
   color:pink;
}

PS1 :

Bazı cevaplar şunları kullanmanızı önerir:

<a href .../>

hrefaçısal bir yönergedir. Şablonunuz açısal olarak işlendiğinde bu,

<a href="" .../>

Bu iki yol esasen aynıdır.


5

Href'den önce ng-tıklama yazmanız yeterli .. Benim için çalıştı

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

Href'den "#" öğesini kaldırmanız gerektiğini sanmıyorum. Angularjs 1.2.10 ile yapılan çalışmaların ardından

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

1

Ayrıca şunu da deneyebilirsiniz:

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

0

Sizin için benim için çalışan bir örnek ekleyeceğim ve bunu istediğiniz gibi değiştirebilirsiniz.

Aşağıdaki kodu denetleyicimin içine ekliyorum.

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

ve görünüm sayfam için aşağıdaki kodu ekliyorum.

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

0

Oturum kapatma işlevinin içinde yeniden yönlendirmeyi denediniz mi? Örneğin, çıkış işlevinizin aşağıdaki gibi olduğunu söyleyin

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

O zaman sadece alabilirsin

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

0

Lütfen bunu kontrol edin

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.