Нужно ли мне удалять неиспользуемые представления на 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
по мере необходимости, вы не будете застревать, делая неприятную модернизацию позже.