0

Я разрабатываю небольшое веб-приложение в backbone.js. В одном представлении я использую метод setInterval для обеспечения некоторого эффекта анимации. Я изменяю атрибут src тега img с интервалом в 3 с путем увеличения переменной index.Объект зомби не удаляется методом remove() в backbone.js

Проблема заключается в том, что при повторном входе в один и тот же вид индексная переменная увеличивается на менее чем за 3 секунды. Иногда это меньше 1 с.

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

Мой маршрутизатор

SearchPage:

function(data) { 

    if(!directory.myview){ 

     directory.myview=new directory.SearchView({model:data}); 

    } 
else{ 

    directory.myview.close(); 
     directory.myview=new directory.SearchView({model:data}); 

    } 

    // code to append the rendered view to html page comes here 

} 

Мой Посмотреть

directory.SearchView = Backbone.View.extend({ 
render:function() { 
    this.$el.html(this.template(this.model)); 
    return this; 
}, 
close :function() 
{  
    this.unbind(); 
    this.remove(); 
    delete this.$el; 
    delete this.el; 
} 

});

+0

Не могли бы вы показать, где вы используете метод setInterval? – mor

+1

Вам больше не нужна функция 'close', если вы связываете события с' listenTo', 'View # remove' будет делать все необходимое, так как Backbone 0.9.9. Однако, вы фактически остановите метод setInterval перед запуском нового с помощью 'clearInterval'? Если вы этого не сделаете, все равно будет ссылка на удаленное вами представление, и это представление не может быть собрано в мусор. – Loamhoof

+0

спасибо, господин. Loamhoof .. я перепроверял мой код для clearInterval. Проблема была там. Исходная переменная для setInterval была изменена в части приложения. Итак, теперь я правильно установил ссылочную переменную. и рабочий штраф –

ответ

0

Я подозреваю, что последовательность в вашем закрытии вызывает проблему. Вы должны удалить представление после удаления элементов ui.

close :function() 
{  
    this.unbind(); 

    delete this.$el; 
    delete this.el; 
    //remove should be last after you delete and unbind 
    this.remove(); 
} 
0

Вы можете прочитать zombies-run-managing-page-transitions-in-backbone-apps размещенные Derick Бейли. Это отличное чтение, и как только вы поймете, что подчеркивает механика, вы можете использовать backbone.marionette для управления своими взглядами.

+4

Эта статья устарела. Проблемы, о которых он говорит, были зафиксированы введением методов «listenTo» и «stopListening» в Backbone 0.9.9. Marionette с тех пор давно развивается и на самом деле не служит цели избежать зомби. – Loamhoof

+0

Спасибо за исправление :-) По пути вопрос отправлен, думая, что это полезно, чтобы принести сообщение вверх :-) –