2011-11-29 39 views
12

Tôi đang tạo một ứng dụng trong Backbone.js có một chế độ xem cha và nhiều con. Các khung nhìn con chứa các liên kết mà chúng lắng nghe và thực hiện một hàm.Tại sao các sự kiện không kích hoạt sau lần hiển thị thứ hai trong Backbone.js?

Cha mẹ lưu trữ danh sách tất cả các chế độ xem của trẻ em. Trong hàm kết xuất, sau khi hoàn thành việc tính toán html của chính nó, nó thực hiện như sau:


$(this.el).html(html); 
for (var i = 0; i < this.views.length; i++){ 
    $('.children', this.el).append(this.views[i].render().el); 
} 

TRẢ LỜI: Vấn đề là tôi đã tạo liên kết trong khi kết xuất. I E. trên render đầu tiên (được gọi từ init) sự kiện này đã được liên kết thành công với liên kết. Tuy nhiên, vì tất cả các cuộc gọi render sau đây tạo lại toàn bộ phần tử, liên kết mới không có trình xử lý được liên kết với nó. Điều này đã được giải quyết thông qua giải pháp @ Tom Tu thêm this.delegateEvents() để render

Trả lời

13

Bạn đang thể sử dụng jquery remove chức năng ở đâu đó để loại bỏ các subviews từ giao diện - nó tự động loại bỏ tất cả các sự kiện ràng buộc với nguyên tố (this.el) - đặt trong đối tượng events. Bạn có thể sử dụng phương thức this.delegateEvents() trong kết xuất của các bản xem sau sau khi bạn tạo mẫu để rebind các đại biểu sự kiện được đặt trong đối tượng events hoặc sử dụng phương thức jquery detach thay thế để loại bỏ các phần tử khỏi DOM mà không xóa các ràng buộc sự kiện (link). Phương pháp delegateEvents khá tốn kém và do đó tôi khuyên bạn nên sử dụng phương pháp detach để xóa các phần tử mà bạn muốn sử dụng lại nếu bạn đang hiển thị danh sách các bản xem trước dài - không liên quan nếu đó chỉ là một vài chế độ xem.

Khả năng khác là bạn đã đặt sai đối tượng events - khó có thể biết số lượng mã được cung cấp, nhưng tôi đặt cược vào mã đầu tiên.

+0

thêm hơn một chút chi tiết, hy vọng nó sẽ giúp –

+0

đó là một ý nghĩ thực sự tốt, nhưng tôi đã thêm phương thức remove mã trên. Ngoài ra, các sự kiện không thể được đặt sai, hoặc nó sẽ không cháy ở nơi đầu tiên. – chacham15

7

Thách thức thực sự phổ biến. Đối với những người tìm tương lai của câu hỏi này, đây là một bài viết tuyệt vời về hiển thị chế độ xem:

Bạn chỉ cần ủy quyền delegateEvents để rebind các sự kiện trên các bản xem phụ của bạn bất kỳ lúc nào .html() chạy. Và kể từ khi setElement Backbone của gọi delegateEvents đã có, một giải pháp nhanh chóng có thể trông như thế này ...

http://ianstormtaylor.com/rendering-views-in-backbonejs-isnt-always-simple/

+0

Đó chính xác là những gì tôi đang tìm kiếm. Cảm ơn! –

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