2011-12-15 36 views

Trả lời

5

này là không thể vì Backbone sử dụng các sự kiện băm để đăng ký các sự kiện trên yếu tố của view (tài sản view.el) và các yếu tố của hậu duệ. Nó không đăng ký các sự kiện từ các phần tử bên ngoài phần tử của khung nhìn. Vì vậy, nếu phần tử của khung nhìn của bạn là bảng, thì hàm doSomething() sẽ được gọi khi sự kiện keydown được kích hoạt trên bảng, nhưng nó sẽ không được gọi nếu sự kiện keydown được kích hoạt trên một phần tử khác trên trang.

+0

Chế độ xem có 'el = $ (" body ")'? Không phải là tôi sẽ sugest đó - chỉ cho niềm vui của nó/tò mò. –

+1

@PLJ nếu el là $ ("body") thì nó sẽ hoạt động. Không biết nhiều khung nhìn Backbone có phần thân như là phần tử của nó. – Paul

2

Nói chung KeyDown vào 'html' nên làm việc, xem câu hỏi này:

keydown on body?

Tuy nhiên, nói chung là tốt hơn để có các sự kiện trong một Backbone Xem được kích hoạt bởi các yếu tố trong el của Chế độ xem. Trong trường hợp đó bạn có thể làm bạn chung Xem ứng dụng toàn chấp nhận đầu vào KeyDown:

events: { 
    'keydown': 'doSomething' 
} 
1

Chỉ cần gắn kết nó bằng cách sử dụng một khung công tác như jQuery bên trong phương thức khởi tạo của chế độ xem.

var View = Backbone.View.extend({ 
     initialize: function() { 
     _.bindAll(this, "keyPress"); 
     $(document).bind('keydown', this.keyPress); 
     }, 
     keyPress: function(e) { 
     console.log(e.keyCode); 
     alert(e.keyCode); 
     return false; 
     } 
    }); 

Đừng quên hủy liên kết, điều quan trọng là; bạn có thể kiểm tra trong keyPress để xem xem vẫn còn trong dom (tài liệu) bằng cách sử dụng $(document).find(this.$el).size()

if($(document).find($(this.options.container)).size() <= 0) { 
     alert("view not in document"); 
     $(document).unbind('keydown', this.keyPress); 
}else { 
     alert("view is here"); 
} 
Các vấn đề liên quan