2015-11-15 4 views
2

При выполнении следующего кода Collection View не полностью удаляется. currentView.remove(); и currentView.unbind(); не снимает & вскрыть все изображения в изображениях модели. Что мне нужно сделать, чтобы удалить просмотр коллекции + модель? (Сброс не вариант)Ошибка утечки памяти.

var Coll_Item = .. //contains collection within models 

var currentView = new DiagnoseApp.Views.Coll_Item({collection: Coll_Item}); 
currentView.remove(); 
currentView.unbind(); 

(я взял кучного снимки с Google-хром и всякий раз, когда код выполняется куча растет.)

Коллекция Вид:

DiagnoseApp.Views.Coll_Item = Backbone.View.extend({ 
    initialize: function(){ 
     this.collection; 
    }, 
    render: function(){ 
     this.addAll(); 
    }, 
    addAll: function(){ 
      this.$el.html($('<table id="whatever" />')); 
      this.collection.each(this.addOne, this);    
    }, 
    addOne: function(Param){ 
      var tbodyView = new DiagnoseApp.Views.item({model: Param}); 
      this.$el.find('#whatever').append(tbodyView.el); 
    } 
}); 

Model View :

DiagnoseApp.Views.item = Backbone.View.extend({ 
    newTemplate: _.template($('#item-template1').html()), 
    initialize: function() { 
     this.render(); 
     this.model.on('change', this.render, this); 
    }, 
    render: function() { 
     this.$el.html(this.newTemplate(this.model.toJSON())); 
    }, 
    events: { 
     'blur .edit' :  'editParam', 
     'keypress .edit' : 'updateOnEnter' 
    }, 
    updateOnEnter: function (e){ 
     if (e.which == 13){ 
      this.editParam(); 
     } 
    }, 
    editParam: function(){ 
     var newValue = this.input.val().trim(); 
     this.model.set('val', newValue); 
    } 
}); 
+2

'this.listenTo (this.model, 'change', this.render);' –

ответ

2

Dominic имеет верный ответ, но если вам нужна дополнительная информация: в вашем коде статуты t

this.model.on('change', this.render, this); 

заставляет модель хранить ссылку на представление. Пока существует модель, эта ссылка все равно будет существовать, и JavaScript должен будет хранить копию обзора вокруг, если модель попытается что-то с ней сделать.

Если, вместо этого, вы изменить свой код, как говорит Доминик:

this.listenTo(this.model, 'change', this.render); 

Тогда модель больше не будет сохранить ссылку на представление. В этом случае удаление представления безопасно, и механизм JavaScript освободит память при удалении представления.

+0

Да, вам все равно нужно удалить представления. –

+0

, который работает для меня! куча перестала расти! –

Смежные вопросы