У меня есть фильтр, работающий над моей базовой коллекцией. Введите поиск в поле поиска и список живых фильтров. Работает отлично, или я так думал. Когда я посмотрел на снимок кучи памяти в Chrome, я увидел утечку памяти при каждом поиске... 6 мегабайт 8 мегабайт... вскоре снимки кучи составляют более 100 мегабайт.
Я изолировал проблему в представлении ниже. Если я закомментирую this.listenTo в функции инициализации, у меня больше не будет утечки памяти.
Итак, мой вопрос заключается в том, как мне сохранить эти прослушиватели событий и живую фильтрацию в коллекции без утечек.
var View = Backbone.View.extend({
tagName: 'tr',
initialize: function() {
this.listenTo(this.model, 'change', this.render);
this.listenTo(this.model, 'destroy', this.remove);
},
events: {
'click .edit': 'edit',
'click .delete': 'delete',
},
edit: function() { /* EDIT */ },
delete: function() {
this.model.destroy(); //backbone
},
render: function () {
var template = _.template( ProductTemplate )
this.$el.html( template({ this.model.toJSON() }) )
return this;
}
})
var ListView = Backbone.View.extend({
initialize: function()
{
this.collection = new Collection( Products ) //products are bootstrapped on load
},
render: function (terms)
{
this.$el.html( ListTemplate );
var filtered = Shop.products.collection.search(terms)
_.each(filtered, this.addOne, this)
//append list to table
$('#products').html( this.el )
return this
},
addOne: function (product)
{
this.$el.find('tbody').append(
new View({ model: product }).render().el
)
return this
},
});
var Collection = Backbone.Collection.extend({
model: Model,
search : function(letters){
//set up a RegEx pattern
var pattern = new RegExp(letters,"gi")
//filter the collection
return this.filter(function(model)
{
if(letters == "") return true //if search string is empty return true
return pattern.test(model.attributes['Product']['name'])
});
}
});
РЕШЕНО:
Это мой новый метод поиска. Я больше не фильтрую коллекцию и не перерисовываю. Я просто перебираю коллекцию, и если модель соответствует поиску, мы запускаем событие «показать», если ее нет в поиске, мы запускаем событие «скрыть». Затем мы подписываемся на эти события в представлении и действуем соответственно.
функция поиска из коллекции: search : function(query){
//set up a RegEx pattern
var pattern = new RegExp(query,"gi")
//filter the collection
this.each(function(model){
if ( pattern.test(model.attributes['Product']['name']) ){
model.trigger('show')
}
else{
model.trigger('hide')
}
});
}
Новое представление: var ProductView = Backbone.View.extend({
tagName: 'tr',
initialize: function() {
this.listenTo(this.model, 'show', this.show);
this.listenTo(this.model, 'hide', this.hide);
},
hide: function()
{
this.$el.addClass('hide')
},
show: function()
{
this.$el.removeClass('hide')
},
render: function ()
{
var template = _.template( ProductTemplate )
this.$el.html( template( {data: this.model.toJSON(), Utils: Shop.utils} ) )
return this;
}
});
View
, но никогда не вызываете для нихremove
? - person mu is too short   schedule 20.01.2013