2012-02-11 4 views
1

Я работаю над приложением Backbone, которое использует много видов. Я попал в ловушку (обычно я думаю) о создании экземпляра Router (своего рода главного контроллера), который отвечает за очистку представлений, создание новых экземпляров и заполнение их данными. Я говорю, что ловушка, потому что, хотя JavaScript имеет встроенный сборщик мусора, можно быстро начать замечать, как удобство использования приложения затрудняется множеством неиспользуемых представлений, которые все еще находятся где-то в памяти.Утилизация в Backbone.JS

Мне жаль, что не было способа утилизировать эти виды. Я думал, что это будет так же просто, как вызвать initialize() в представлении с новой моделью, а затем повторить. Это, к сожалению, не так просто.

Кроме того, нужно было бы своего рода «уничтожить» вид ручки, например, обработчики событий и прочее ...

Что бы хорошая практика, чтобы сделать это?

ответ

3

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

http://api.jquery.com/detach/

Если вы хотите, чтобы переработать вид, просто кэшировать его в переменной.

Внутри метода инициализации ваших router «ы, сделать что-то вроде этого:

this.views = {}; 

Затем, когда маршрут называется проверкой, если имя представления доступно в кэше и если он есть, использовать то, иначе создайте новый.

someRoute: function() { 
    var view; 
    if (_.has(this.views, 'someRouteView')) { 
     view = this.views.someRouteView; 
    } else { 
     view = new SomeRouteView; 
     this.views.someRouteView = view; 
    } 
    // You have a view now 
} 

Опять же, если вы не создать новый вид, вы должны будете использовать что-то вроде detach метода JQuery, чтобы сохранить обработку событий.

+0

Что относительно инициализации? Должен ли я специально вызвать функцию «конструктор» для повторной инициализации? Просто вызов «initialize» не будет выполнять задание – preslavrachev

+0

Вы никогда не называете 'initialize' непосредственно на представлениях в магистрали. Если ваше имитирующее наследование в другом методе 'initialize'. Представление будет уже инициализировано при кэшировании. Вызов 'new View' запускает метод init. – Trevor

+0

Единственное реальное преимущество использования кешированного представления - производительность. При каждом запуске маршрута вам не придется переустанавливать представление. – Trevor

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