40

fokurdayan olay: Ben düğmeye showItem() tıkladığınızdaangularjs - Birden ng tıklama - Aşağıdaki örnekte

<li ng-repeat="item in items" ng-click="showItem(item)"> 
    <h3>{{item.title}}</h3> 
    <button ng-click="remove(item)">Remove</button> 
    </li> 

da olaya fokurdayan nedeniyle çağrılır. $event.currentTarget'u izlemek ve $event.stopPropagation() vb. Için $event'u kullanabileceğimi biliyorum ancak bu çok çirkin.

B

Btw. Ben button üzerinde yayılmasını durdurmak istemiyorum (Benim durumumda button bir twitter bootstrapdopdown/button - bu sadece bir örnektir edilir)

nasıl remove butonuna tıklayın çağrılan beeing showItem() durdurabilirim?

çirkin düzeltme olacağını DÜZENLEME olması: item geçirilen eğer

function remove(item,$event){ 
    $event.originalEvent.prevent = true; 
    // rest of the code 
} 

function showItem(item,$event){ 
    if($event.originalEvent.prevent)return; 
    // rest of the code 
} 
+0

, sen gerekecektir dışarı denemek için Kubbinizi yeniden yapılandırın, böylece iç içe değil. Mümkün mü? –

cevap

63

Bu çözüm çalıştı Benim için (sadece son tarayıcıları destekliyorum, bu yüzden daha fazla retro uyumlu olması için kodu değiştirmeyi denedim):

HTML:

<li ng-repeat="item in items" ng-click="showItem(item)"> 
    <h3>{{item.title}}</h3> 
    <button ng-click="remove(item, $event)">Remove</button> 
</li> 

Komut:

function remove(item, $event) { 
    // do some code here 

    // Prevent bubbling to showItem. 
    // On recent browsers, only $event.stopPropagation() is needed 
    if ($event.stopPropagation) $event.stopPropagation(); 
    if ($event.preventDefault) $event.preventDefault(); 
    $event.cancelBubble = true; 
    $event.returnValue = false; 
} 
function showItem(item) { 
    // code here 
} 

DÜZENLEME - Added bir JSFiddle demo stopPropagation kullanamıyorsanız http://jsfiddle.net/24e7mapp/1/

+0

Bu yöntem benim için Chrome Version 35.0.1916.153 m'de çalışmadı, ancak $ event.stopPropagation() yaptı. $ Event.returnValue'ye ihtiyacım yoktu. –

+0

Tam olarak. Chrome'da (ve diğer modern tarayıcılarda) ilk satırda durabilirsiniz: '$ event.stopPropagation();' ('if' olmadan). Ancak yorumlarda belirtildiği gibi, IE8'de daha az çalışmanız gerekirse, '$ event.preventDefault()' veya 'cancelBuble/returnValue' kullanmanız gerekir. Belki bu ikisinden biri gerekli değildir, tam olarak hatırlayamıyorum. – Tibo

+0

Kromum üzerinde çalışmaz. – Ron

0

showItem erken dönmek için güncellenebilir artık yok:

function remove(item) { 
    if (-1 == $scope.items.indexOf(item)) { 
    // Item no longer exists, return early 
    return; 
    } 
    // Rest of code here 
}