2011-09-25 51 views
11

Được rồi, vì vậy tôi đã đọc một số câu hỏi khác liên quan đến quan điểm của Backbone và các sự kiện không bị sa thải, tuy nhiên tôi vẫn không nhận được nó buồn bã. Tôi đã rối tung với Backbone khoảng một ngày, vì vậy tôi chắc chắn rằng tôi đang thiếu một cái gì đó cơ bản. Dưới đây là một jsfiddle với những gì tôi đang làm việc với: http://jsfiddle.net/siyegen/e7sNN/3/sự kiện backbone.js và 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); 

Sự kiện okay trên GridView không chớp, tôi giả sử vì div.grid-view không tồn tại khi sự kiện là ràng buộc đầu tiên. Tôi nên xử lý sự ràng buộc và kích hoạt của một sự kiện được xây dựng trên một khung nhìn động như thế nào? (Ngoài ra, nó là một ví dụ ngắn, nhưng cảm thấy tự do để la mắng tôi nếu tôi đang làm bất cứ điều gì khác mà tôi không nên)

+0

vì 'el' là thẻ div có' .grid-view'. và bạn đang tìm phần tử tên lớp '.grid-view' trong div đó. mà bạn sẽ không nhận được nó. – Mahi

Trả lời

21

Vấn đề của bạn là sự kiện trên GridView:

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

nói:

khi bạn click vào một hậu duệ phù hợp '.grid-view', gọi okay

Các sự kiện đang bị ràng buộc với snippet from backbone.js này:

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

Vì vậy, các yếu tố .grid-view phải được chứa trong GridView của bạn this.elthis.el của bạn là <div class="grid-view">. Nếu bạn thay đổi events của bạn như thế này:

events: { 
    'click': 'okay' 
} 

bạn sẽ nghe thấy con bò của bạn (hoặc "nghe họ trong tâm trí của bạn" sau khi đọc báo tùy thuộc vào cách điên vấn đề này đã làm cho bạn).

Đã sửa lỗi: http://jsfiddle.net/ambiguous/5dhDW/

+0

Điều đó có hiệu quả, cảm ơn. Nói chung, nếu tôi muốn liên kết một sự kiện với phần tử mà chính chế độ xem đang tạo, tôi sẽ bỏ chọn bộ chọn? Tôi đã thử nghiệm điều đó và nó hoạt động với một chế độ xem khác, chỉ cần đảm bảo đó là cách phù hợp để thực hiện mọi thứ. – siyegen

+0

@siyegen: Đúng vậy. Hãy xem chi nhánh đầu tiên của đoạn mã 'backbone.js' mà tôi đã đưa vào; nếu không có bộ chọn, thì sự kiện sẽ được liên kết trực tiếp với 'this.el' bằng cách sử dụng' $ (this.el) .bind (eventName, method); ', nếu có một bộ chọn thì sự kiện đó được ràng buộc với' delegate' . –

+0

nhưng điều gì sẽ xảy ra khi tôi muốn kích hoạt sự kiện chỉ khi 'this.el' có lớp' grid-view'? – Jashwant

Các vấn đề liên quan