2012-06-10 25 views
8

Hàm View.remove() trong các đường trục js loại bỏ phần tử vùng chứa của khung nhìn khỏi ngăn DOM khỏi việc tái tạo các khung nhìn đã bị xóa. Bất cứ ý tưởng như thế nào kịch bản này được xử lýTạo lại một khung nhìn đã bị loại bỏ trong các đường trục js

Đây là mã của tôi,

var AttributeView = Backbone.View.extend({ 
     el: $("#attrs"), 
     template:_.template($('#attrs-template').html()), 

     initialize:function() { 
     }, 


     render:function (eventName) { 
      $(this.el).html(this.template(this.model.toJSON())); 
      return this; 
      }, 

     dispose:function(eventName){ 
      this.unbind(); 
      this.remove(); 
     }, 

    }); 


var attrView = new AttributeView(); 
.... 
attrView.dispose(); 
//Later on some event I do the below 
attrView = new AttributeView() 
attrView.render(); 

Hai dòng cuối cùng trên không tái tạo xem như div với id = "attrs" không phải là còn ở đó.

Trả lời

21

Trước hết, bạn không cần phương pháp dispose của bạn, tiêu chuẩn remove là đủ:

var attrView = new AttributeView(); 
//.... 
attrView.remove(); // <--------- Do this instead 
//... 
attrView = new AttributeView() 
attrView.render(); 

Thứ hai, bạn có thể ghi đè remove nếu phiên bản tiêu chuẩn không làm những gì bạn cần. Các default implementation chỉ đơn giản là loại bỏ this.el và dọn dẹp một số người nghe sự kiện:

remove: function() { 
    this.$el.remove(); 
    this.stopListening(); 
    return this; 
}, 

Trong trường hợp của bạn, bạn muốn phục hồi lại tất cả những gì render làm và đó có nghĩa là giải phóng ra HTML bênthis.el và loại bỏ các sự kiện bằng cách gọi undelegateEvents:

remove: function() { 
    this.undelegateEvents(); 
    this.$el.empty(); 
    this.stopListening(); 
    return this; 
}, 

Sau đó, bạn có thể gọi attrView.remove() và tắt nó đi và (new AttributeView()).render() để đưa lại.

Demo: http://jsfiddle.net/ambiguous/Pu9a2/3/

+0

Cảm ơn bạn đã trả lời. Nhưng đối với một số mã lý do tương tự như ví dụ của bạn không làm việc. Tôi đã tạo http://jsfiddle.net/EnVmN/7/ để minh họa sự cố tôi gặp phải. Bất kỳ ý tưởng những gì tôi đang làm sai. Tôi đang sử dụng lại AttributeView của bạn nhưng thêm ItemView và cố gắng hiển thị và loại bỏ các attributeview trên nhấp vào chỉnh sửa và loại bỏ các biểu tượng tương ứng. – mzafer

+0

@mzafer: Sự kiện của chế độ xem chỉ hoạt động trên 'el' và các con của chế độ xem, ItemView của bạn được hiển thị thành' # items' nhưng đó không phải là 'số' của ItemView vì vậy các sự kiện nhấp trên biểu tượng của bạn không được gửi tới ItemView: http://jsfiddle.net/ambiguous/KjC6x/ –

+0

Cảm ơn nhiều, nó hoạt động ngay bây giờ :) Đã dành gần hai ngày về điều này. – mzafer

0

Hãy xem LayoutManager cho Backbone xem, mà hiểu rằng khi bạn xóa một cái nhìn (mẹ - theo nghĩa ngăn chặn và không đối tượng phân cấp cảm giác), subviews của nó cũng nên được gỡ bỏ.

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