2012-06-11 41 views
11

Tại sao tôi phải tạo toàn bộ close prototype chỉ để các sự kiện của tôi bị hủy liên kết khỏi chế độ xem của tôi? Không nên xương sống chỉ cần xây dựng mà? Có cách nào để phát hiện khi một chế độ xem đang bị xóa không?Sự kiện trục chính kích hoạt hai lần

Sự kiện xương sống của tôi kích hoạt hai lần sau khi tôi điều hướng và quay lại chế độ xem.

 events : { 
      "click #userDropdownButton > a" : "toggleUserDropdownMenu", 
      "click" : "hideUserDropdownMenuIfClickedOutside" 
     }, 

     el : "body", 

     initialize : function() { 
      this.render(); 
     }, 

     // Shows/hides the user dropdown menu 
     toggleUserDropdownMenu : function() { 
      if(!this.$el.find('#userDropdownButton > ul').is(':visible')) { 
       this.showUserDropdownMenu(); 
      } else { 
       this.hideUserDropdownMenu(); 
      } 
      return false; 
     }, 
     showUserDropdownMenu : function() { 
      this.$el.find('#userDropdownButton').addClass('hover'); 
      this.$el.find('#userDropdownButton > ul').show(); 
      this.$el.find('#userDropdownButton > a .arrow-down').removeClass('arrow-down').addClass('arrow-up'); 
     }, 
     hideUserDropdownMenuIfClickedOutside : function() { 
      if(this.$el.find('#userDropdownButton > ul').is(':visible')) { 
       this.hideUserDropdownMenu(); 
      } 
     }, 
     hideUserDropdownMenu : function() { 
      this.$el.find('#userDropdownButton').removeClass('hover'); 
      this.$el.find('#userDropdownButton > ul').hide(); 
      this.$el.find('#userDropdownButton > a .arrow-up').removeClass('arrow-up').addClass('arrow-down'); 
     }, 

Lần đầu tiên xem là ra, thả xuống sẽ mở ra và đóng lại đúng cách, nhưng trên lần thứ hai xem là ra, thả xuống giải thích mỗi nhấp chuột hai lần, vì vậy ngay sau khi nó mở ra, đóng cửa nhấp chuột thứ hai nó.

+1

Nếu chúng tôi biết bạn đang làm gì thì chúng tôi có thể cho bạn biết bạn đang làm gì sai. Có lẽ nếu có một số mã để xem xét ... –

+0

@muistooshort thêm mã :) cảm ơn cho các thông tin phản hồi – Garrett

+0

Tôi muốn gọi đây là một bản sao của http://stackoverflow.com/q/10966440/479863 hoặc ít nhất là câu trả lời là khá nhiều như nhau. –

Trả lời

14

Cập nhật 2013/05/01: Backbone 0.9.9+ đã bổ sung một số tích hợp chức năng để tạo điều kiện dễ dàng đối phó với vấn đề teh ZOMG (xem View.removeStopListening); nhưng bạn vẫn cần phải tiêu diệt zombie của mình bằng cách gọi một trong số chúng.


Tại sao tôi phải tạo nguyên mẫu gần như hoàn toàn để các sự kiện của tôi không bị chặn khỏi chế độ xem?

Derick's article thật tuyệt vời khi đề cập đến toàn bộ vấn đề này. Nhưng tôi có thể thêm hai bit của tôi, giải quyết câu hỏi của bạn về "tại sao" nó không được xây dựng.

Do cách hoạt động của tổ chức sự kiện Backbone, lượt xem sẽ không được thu thập rác khi chúng nằm ngoài phạm vi nếu chúng có sự kiện ràng buộc. Điều này là do các đối tượng có các sự kiện mà chúng liên kết với các đối tượng Backbone, trong trường hợp ràng buộc với các sự kiện đối tượng Backbone hoặc hệ thống sự kiện DOM trong trường hợp gọi lại "events" - duy trì tham chiếu đến các chức năng của khung nhìn.

Tin hay không, một số người dùng Backbone dựa vào hành vi này và mong đợi các quan điểm tiếp tục tự động trả lời các sự kiện như họ được yêu cầu làm, ngay cả khi họ đã hoàn toàn nằm ngoài phạm vi. Điều này giả định rằng bạn không bao giờ cần phải loại bỏ chế độ xem hoặc chế độ xem có thể phản hồi các sự kiện và xóa chính nó, vì bạn đã mất mọi tham chiếu đến nó, nhưng IMO, cái này ' tạo và quên 'chức năng là tốt đẹp miễn là bạn hiểu được ý nghĩa.

mu is too short làm cho một điểm tốt về sự kiện giao diện người dùng. Việc xóa el khỏi DOM cũng sẽ xóa các sự kiện được ủy nhiệm. Điều tương tự không thể được nói cho ràng buộc để mô hình hoặc các sự kiện thu thập hoặc các sự kiện đối tượng Backbone khác (bất kỳ đối tượng nào cũng có thể mở rộng nguyên mẫu Sự kiện Backbone). Bạn sẽ cần phải làm theo lời khuyên của Derick Bailey trong bài viết bạn liên kết và đóng chế độ xem theo cách thủ công trong các trường hợp này. Tôi không chắc liệu đây có phải là điểm yếu của Backbone so với các khung công tác JS MVC khác hay không, tôi đã không thử những người khác theo chiều sâu.

"Có cách nào để phát hiện khi chế độ xem đang bị xóa không?"

Không trực tiếp, mà tôi biết. Nhưng nói chung, bất kỳ mã nào đang loại bỏ chế độ xem cũng sẽ xóa các ràng buộc sự kiện nếu cần. Thông thường, trong kiến ​​trúc MVC tốt, lượt xem có thể thiết lập người quan sát sự kiện trên mô hình hoặc bộ sưu tập tương ứng và sau đó xóa & dọn dẹp dựa trên sự kiện xảy ra (ví dụ: sự kiện "xóa" khỏi mô hình tương ứng). Nếu bạn muốn loại bỏ các chế độ xem của bạn một cách phổ biến "có thể phát hiện được", một cách sẽ là ghi đè hàm xóa trong nguyên mẫu chế độ xem của riêng bạn và kích hoạt sự kiện tùy chỉnh mà người khác có thể quan sát.

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