2012-02-21 2 views
14

Nếu tôi lưu trữ xem trong window.myView biến, làm cho nó, sau đó gọi trong giao diện điều khiển javascript:Tại sao các sự kiện Backbone thay thế html không hoạt động?

$('#container').html('') 

và sau đó gọi:

$('#container').html(window.myView.$el) 

sự kiện ràng buộc sẽ ngừng làm việc.

Tôi khá chắc chắn rằng được coi là như vậy, nhưng:

  • tại sao chính xác nó hoạt động theo cách này?
  • làm cách nào để kết xuất lại phần phụ của chế độ xem bằng cách mất kết buộc sự kiện?
  • lý do tại sao gọi myView.render() sẽ không mất các ràng buộc sự kiện?

Cập nhật:

Tìm thấy this bài viết. Đó có phải là lý do?

Hãy chắc chắn rằng jQuery không dỡ các sự kiện của bạn khi bạn không muốn nó

Nếu bạn đang xây dựng một ứng dụng mà bạn tạo ra quan điểm một cách nhanh chóng và đính kèm/loại bỏ chúng vào dom, bạn có thể có một vấn đề. Mỗi khi bạn loại bỏ một cái nhìn từ dom, jQuery dỡ tất cả các sự kiện. Vì vậy, bạn không thể có tham chiếu đến chế độ xem và xóa chế độ xem khỏi vị trí và sau đó đính kèm lại sau. Tất cả các sự kiện của bạn sẽ bị xóa. Nếu bạn muốn giữ các khung nhìn xung quanh, một ý tưởng tốt hơn là ẩn chúng bằng cách sử dụng display: none. Tuy nhiên, bạn không nên lạm dụng điều này và tái chế các khung nhìn mà bạn sẽ không sử dụng trong một thời gian (và ngăn chặn rò rỉ bộ nhớ).

+0

Cảm ơn câu hỏi này. Tôi đã có một vấn đề tương tự với cột sống và không thể tìm ra những gì đang xảy ra ở tất cả. –

Trả lời

18

jQuery empty, htmlremove sự kiện được dọn dẹp tất cả các sự kiện jquery và dữ liệu ràng buộc để ngăn chặn rò rỉ bộ nhớ (bạn có thể kiểm tra mã nguồn jQuery cho cleanData phương pháp để tìm hiểu thêm - đó là một phương pháp không có giấy tờ)

view.render() không loại bỏ các sự kiện vì các sự kiện xem xương sống bị ràng buộc bằng cách sử dụng tính năng ủy quyền sự kiện và được liên kết với chế độ xem el thay vì trực tiếp đến các phần tử trong chế độ xem.

Nếu bạn muốn sử dụng lại chế độ xem, bạn có thể xóa chúng bằng phương pháp jQuery detach giữ tất cả các sự kiện và dữ liệu bị ràng buộc mặc dù bạn phải cẩn thận để không bị rò rỉ bộ nhớ theo cách này. (jquery detach docs)

Nếu bạn muốn đi theo cách đầu tiên, bạn luôn có thể khôi phục sự kiện Backbone dễ dàng bằng phương pháp Backbone.View delegateEvents. (backbone doc)

ps. nó cũng sạch hơn và tối ưu hơn để sử dụng jQuery .empty() thay vì sau đó .html('') như phương pháp jQuery html luôn gọi trước hết để dọn sạch tất cả các sự kiện và dữ liệu trước khi chèn html mới. Cũng không bao giờ trộn jquery và nativeHTML bên trong vì nó có thể tạo ra rò rỉ bộ nhớ gây ra không làm sạch các sự kiện/dữ liệu jQuery

+1

gọi 'này.delegateEvents() 'trong khung nhìn làm việc giống như một sự quyến rũ. cảm ơn. –

+0

Hoan hô cho .delegateEvents! – SimplGy

+0

Cũng xem xét rách xuống và tạo lại tất cả các chế độ xem phụ khi bạn hiển thị chế độ xem gốc. –