2011-09-25 26 views
11

Tamam, bu yüzden Backbone görüşlerine ve olayların işlenmemesine ilişkin başka birçok soru okudum, ancak yine de üzülmüyorum. Bir günlüğüne Omurga ile uğraşıyordum, eminim ki temel bir şey eksik. , http://jsfiddle.net/siyegen/e7sNN/3/backbone.js olayları ve el

(function($) { 

    var GridView = Backbone.View.extend({ 
     tagName: 'div', 
     className: 'grid-view', 
     initialize: function() { 
      _.bindAll(this, 'render', 'okay'); 
     }, 
     events: { 
      'click .grid-view': 'okay' 
     }, 
     okay: function() { 
      alert('moo'); 
     }, 
     render: function() { 
      $(this.el).text('Some Cow'); 
      return this; 
     } 
    }); 

    var AppView = Backbone.View.extend({ 
     el: $('body'), 
     initialize: function() { 
      _.bindAll(this, 'render', 'buildGrid'); 
      this.render(); 
     }, 
     events: { 
      'click button#buildGrid': 'buildGrid' 
     }, 
     render: function() { 
      $(this.el).append($('<div>').addClass('gridApp')); 
      $(this.el).append('<button id="buildGrid">Build</button>'); 
     }, 
     buildGrid: function() { 
      var gridView = new GridView(); 
      this.$('.gridApp').html(gridView.render().el); 
     } 

    }); 

    var appView = new AppView(); 

})(jQuery); 

GridView'da okay olayı başlatılmıyor olay ilk bağlandığı zaman div.grid-view yok çünkü farz ediyorum: İşte birlikte çalıştığım şeyi olan bir jsfiddle bu. Görünüm üzerinde dinamik olarak oluşturulmuş bir olayın nasıl bağlanacağını ve tetikleneceğini nasıl ele almalıyım? (Ayrıca, kısa bir örnek, ama ben Almamalıyım başka bir şey yapıyorsam bana bağırma çekinmeyin)

+0

' çünkü. ve bu div içinde '.grid-view' sınıf adı öğesini buluyorsunuz. bunu alamayacaksın. – Mahi

cevap

21

Senin sorunun GridView'da olaylar şudur:

events: { 
    'click .grid-view': 'okay' 
} 

ki: Eğer '.grid-view' eşleşen bir soyundan tıkladığınızda

, çağrı okay

olaylar bu snippet from backbone.js ile bağlıdırlar:

if (selector === '') { 
    this.$el.on(eventName, method); 
} else { 
    this.$el.on(eventName, selector, method); 
} 

Yani .grid-view öğesi GridView en this.el içinde yer zorundadır ve this.el <div class="grid-view"> olduğunu. Eğer inek duyarsınız

events: { 
    'click': 'okay' 
} 

(veya bu sorun sizi yapmıştır ne kadar çılgın bağlı uyarısı okuduktan sonra "kafanızda bunları duymak"): Bu şekilde events değiştirirseniz.

Sabit keman: el` `.grid-view` div etikettir http://jsfiddle.net/ambiguous/5dhDW/

+0

Bu işe yaradı, teşekkürler. Genel olarak, bir olayı görüntünün kendisinin yarattığı öğeye bağlamak istersem, seçiciyi dışarıda bırakır mıyım? Bunu test ettim ve başka bir bakış açısıyla çalışıyorum, sadece bu şeylerin yoluna gitmenin doğru yolu olduğundan emin olmak. – siyegen

+0

@siyegen: Right. İçerdiğim 'backbone.js' pasajının ilk dalına bir göz atın; Seçici yoksa, olay doğrudan "this.el" ile "this.el" .bind (eventName, method);), eğer bir seçici varsa olay "delegate" ile bağlanır. . –

+0

ama ne zaman olay sadece 'this.el' 'grid-view' sınıfına sahip olduğunda ateş etmek istiyorum? – Jashwant