Backbone.js:如何在父视图和子视图上执行垃圾收集

时间:2011-11-04 08:13:32

标签: backbone.js

我已经为所有Backbone视图实现了一个简单的close()方法,当不需要/需要重置时,它会处理视图。

Backbone.View.prototype.close = function() {
    if (this.onClose) {
        this.onClose();
    }
    this.remove();
    this.unbind();
};

NewView = Backbone.View.extend({
    el: '#List ul',
    initialize: function() {},
    render: function() {
       _(this.collection.models).each(function(item) {
            this.renderChildren(item);
       }, this);
    },
    renderChildren: function(item) {
        var itemView = new NewChildView({ model: item });
        $(this.el).prepend(itemView.render());
    },
    onClose: function() {
        this.collection.reset();
        // I want to remove the child views as well
    }
});

NewChildView = Backbone.View.extend({
    tagName: 'li',
    render: function() {
    }
});

现在,当我删除父视图时,我还想删除所有子视图。任何想法如何在不绕过像这样的模型的情况下做到这一点....

   _(this.collection.models).each(function(item) {
        item.close();
   }, this);

1 个答案:

答案 0 :(得分:10)

我认为在大多数情况下,您应该在视图层中保留视图删除,而不会影响您的模型。

例如,如果您删除包含评论的视图,则应用中的其他视图可能会显示一系列评论或某些统计信息,重置该集合也会影响这些视图。

所以我认为你应该在视图中保留所有内容(仅包括相关方法):

NewView = Backbone.View.extend({
    initialize: function() {
       this.childViews = [];
    },
    renderChildren: function(item) {
        var itemView = new NewChildView({ model: item });
        $(this.el).prepend(itemView.render());
        this.childViews.push(itemView);
    },
    onClose: function() {
      _(this.childViews).each(function(view) {
        view.close();
      });
    }
});