2014-08-26 2 views
2

Я заметил, что мое приложение начинает становиться вялым, когда я меняю URL слишком много раз. Я подозреваю, что это связано с тем, что у меня есть маршруты, созданные таким образом, что они создают экземпляр нового представления каждый раз, когда URL-адрес посещен, а не уверен, есть ли другой способ сделать это. Возможно, я недостаточно разбираюсь в javascript. Что происходит с представлениями, которые я создал после того, как они больше не используются, или, другими словами, когда я посещаю новый маршрут?Я создаю слишком много объектов в моих backbone.js маршрутах?

var Router = Backbone.Router.extend({ 
    routes: { 
     '':'doSomething', 
     'helloworld':'doSomethingElse' 
    } 
}); 

var app_router = new Router; 

app_router.on('route:doSomething', function() { 
    var thing = new SomeModel(); 
    new someView({model : thing}); 
}); 

app_router.on('route:doSomethingElse', function() { 
    var thing = new SomeModel(); 
    new someOtherView({model : thing}); 
}); 

так что в этом простом примере, если бы я был щелкать назад и четвёртое по ссылкам <a href="#"> и <a href="#helloworld"> бы там быть просто наращивание зрения и объектов модели? и если бы это было бы проблемой. Я бы предположил, что память будет съедена, но я могу просто не понимать вещи правильно.

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

enter image description here

+0

Вы протечки память? Вы проверили инструменты разработчика вашего браузера? –

ответ

4

Я думаю, что вы производите мнения "зомби". Thishappens при создании вида:

new someOtherView({model : thing}); 

который, вероятно, содержит привязки событий к элементам DOM. В следующий раз, когда вы снова нажмете тот же маршрут, вы просто создадите другое представление с новыми привязками и не отключаете события предыдущего вида.

Дерик Бейли написали большую статью об этом:

http://lostechies.com/derickbailey/2011/09/15/zombies-run-managing-page-transitions-in-backbone-apps/

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

Мои взгляды Магистральные обычно имеют close метод:

close: function() { 
    this.model.stopListening(); 
    // unbind other stuff 
} 

в то время как мои маршрутизаторы всегда держит ссылки на ранее созданных просмотров:

app_router.on('route:doSomething', function(id) { 
    var thing = new SomeModel(); 
    if (this.currentSomeView) { 
     this.currentSomeView.close(); // this will unbind the previously registered events 
    } 
    this.currentSomeView = new someView({model : thing}); 
}); 
+0

Позволяет ли магистраль не выгружать представление? Как и Ext-JS [метод уничтожения компонента] (http://docs-origin.sencha.com/extjs/4.2.2/#!/api/Ext.AbstractComponent-method-destroy) делает? Наверное, нет, см. Http://stackoverflow.com/a/11534056/227299 –

+0

Это похоже на то, что это, вероятно, проблема, потому что у меня есть небольшая привязка событий к элементам DOM в одном из представлений. –

+0

Я расширил свой ответ примером из своего собственного кода. –