Backbone.js : как выполнить сборку мусора как в родительских, так и в дочерних представлениях

#backbone.js

#backbone.js

Вопрос:

Я реализовал простой 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:

Я думаю, что в большинстве случаев вам следует сохранить удаление вида в слое просмотра, не затрагивая ваши модели.

Например, если вы удалите представление с комментариями, возможно, другое представление в вашем приложении покажет подборку комментариев или какую-то статистику, и сброс коллекции также повлияет на эти представления.

Поэтому я думаю, что вы должны сохранить все это в поле зрения (включены только соответствующие методы).:

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