8

主干 js 中的 View.remove() 函数从 DOM 中删除视图本身的容器元素,防止重新创建已删除的视图。知道如何处理这种情况

这是我的代码,

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();

上面的最后两行不会重新创建视图,因为 id="attrs" 的 div 不再存在。

4

2 回答 2

21

首先,你不需要你的dispose方法,标准remove就足够了:

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

remove其次,如果标准版本不能满足您的需求,您可以覆盖。默认实现只是简单地删除this.el和清理一些事件监听器:

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

在您的情况下,您想要撤消所做的一切,render这意味着清除内部 this.el的 HTML并通过调用删除事件undelegateEvents

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

然后你可以调用attrView.remove()并杀死它并(new AttributeView()).render()把它带回来。

演示:http: //jsfiddle.net/ambiguous/Pu9a2/3/

于 2012-06-10T05:21:40.673 回答
0

看看LayoutManager for Backbone Views,它知道当你删除一个视图(父级 - 在包含意义上而不是对象层次结构意义上)时,它的子视图也应该被删除。

于 2013-04-24T15:04:02.980 回答