Нужно ли мне удалять неиспользуемые представления на backbone.js?

var Home = Backbone.View.extend({
template: _.template($('#home-template').html()),

initialize: function (params) {
    this.collection = new BlogList();

    this.listenTo(this.collection, "add", this.renderBlog);
    this.listenTo(this.collection, "reset", this.render);
},

render: function () {
    this.$el.html(this.template({hasPrevious: this.collection.hasPrevious()}));

    this.collection.each(function(item) {
        this.renderBlog(item);
    }, this);

    return this;
},

renderBlog: function(item) {
    this.$('#blog-list-container').append((new BlogPreView({ model: item })).render().el);
},

BlogPreView - это Backbone.View. Новый BlogPreView создается много раз. Нужно ли удалять старые?

Как удалить backbone.view и как мне удалить в этом конкретном примере?

1 ответ

Решение

Вы должны звонить remove на ваши взгляды, чтобы удалить их. Это удалит el из DOM и звоните stopListening отменить любое listenTo звонки, которые вы сделали. Если есть другие вещи, чтобы убрать, то вы должны переопределить remove очистить эти "другие вещи", а затем назвать стандарт remove,

В вашем случае у вас есть дочерние представления, поэтому вы должны следить за ними:

renderBlog: function(item) {
    var v = new BlogPreView({ model: item });
    this.previews.push(v); // Initialize this in `initialize` of course.
    this.$('#blog-list-container').append(v.render().el);
}

а затем очистите их перед повторным рендерингом или удалением:

removePreviews: function() {
    _(this.previews).invoke('remove');
    this.previews = [ ];
},
render: function() {
    this.removePreviews();
    // what you have now goes here...
},
remove: function() {
    this.removePreviews();
    return Backbone.View.prototype.remove.apply(this);
}

Вы часто можете уйти без звонка remove но как только вы обнаружите, что вам это действительно нужно, это может стать серьезной проблемой для remove все правильно. Но если вы позвоните remove все время правильно отслеживать подвиды и переопределять remove по мере необходимости, вы не будете застревать, делая неприятную модернизацию позже.

Другие вопросы по тегам