2012-01-30 29 views
6

Bir menüyü değiştirmek için backbone.js -view'de iki olayı bağlamalıyım. Buradaki fikir şudur: #toggler kimliğine sahip bir düğme tıklandığında menü appers ve #menu öğesinin dışındaki herhangi bir tıklama menüyü gizleyecektir.Backbone.js ve jQuery ile olay bağlama tıklamaları

Maalesef, #menu öğesinin üzerine tıklattıysam da, her tıklamada outsideMenuHandler() çağrılmadan omurganın olay ciltlemesi ile çalışamıyorum.

Bu işi yapmak için neleri değiştirmeliyim?

:

myView = Backbone.View.extend({ 

    events: { 
     'click #menu': 'insideMenuHandler', 
     'click':  'outsideMenuHandler' 
    } 

    insideMenuHandler: function(e) {}, // Called when clicking #menu 
    outsideMenuHandler: function(e) {} // Called on every click both on and off #menu 

} 

Sadece bir referans olarak, burada ben yalnız jQuery kullanarak böyle yapardı:

Bu

ben istendiği gibi çalışmıyor, hangi backbone.js yapmış budur
$(document).click(function(event) { 
    if ($(event.target).closest('#menu').get(0) == null) { 
     $("#menu").slideUp(); 
    } 
}); 

cevap

14

Ayıklamak için ihtiyacınız olan birkaç şey var. Her şeyden

Öncelikle insideMenuHandler döner false veya sonra outsideMenuHandler#menu tıklamalar için çağrılmadığı olmaz e.stopPropogation() çağırırsa. Örneğin:

http://jsfiddle.net/ambiguous/8GjdS/

Ama bu senin bütün sorun değil. outsideMenuHandler numaranız yalnızca görünümünüze yapılan tıklamalar için çağrılır; Bu nedenle, birisi sayfanın görünümünüzün dışına tıklarsa, outsideMenuHandler numaranız aranmaz ve menünüz aşağı inmez. Birisi #menu dışında herhangi bir yere tıkladığında menüyü aşağı gitmek istiyorsanız, o zaman body el ile bağlamak ve görünümünüzün yok olduğunda el ile açmak zorunda kalacaksınız. Böyle bir şey:

ve sonra görünümünüzü düzgün şekilde kaldırdığınızdan emin olun. Örneğin:

http://jsfiddle.net/ambiguous/MgkWG/1/

+0

teşekkürler cevap için çok. Çok takdir! Hızlı bir soru - anladığım kadarıyla, bir tıklama etkinliğinin "false" i geri dönmesine izin verilmesi, "varsayılan etkinliğin" oluşmasını engelleyecektir. Diğer bir deyişle, "externalMenuHandler", "false" değerini döndürdüğü için tüm diğer tıklamalar devre dışı bırakılacaktır. Mantığımı gerçekleştirdikten sonra (menümü gizledikten sonra) 'externalMenuHandler' 'true'ma geri dönmeme izin verirseniz kendimi belaya sokarım mı? – Industrial

+1

@Industrial: 'bodyMenuHandler' öğesine 'body, html' bağlamasından çifte arama ile sonuçlanacaksınız, ancak bu bir sorun olmayabilir. Muhtemelen 'externalMenuHandler' sözcüğünü 'html' ile bağlayabiliyordunuz, ancak tarayıcıya bakmak istediğiniz tüm tarayıcılarda doğru şekilde çalıştığından emin olmak için kontrol etmek isteyebilirsiniz. –

-1

Sorun, olayınızı görünüm elçisi olarak tanımladığınız DOM öğesine bağlamanızdır. Bu, jquery örneğinizde olduğu gibi window.document değilse, bunların dışında herhangi bir tıklama fark edemezsiniz. Örneğinizdeki en kolay yol, olayları jquery ile elle oluşturmak ve omurga ile değil.