Почему события Backbone при замене html не работают? - PullRequest
14 голосов
/ 22 февраля 2012

Если я сохраню представление в переменной window.myView, отобразим его, затем вызову в консоли javascript:

$('#container').html('')

и затем вызову:

$('#container').html(window.myView.$el)

Связанные события перестанут работать.

Я почти уверен, что так и должно быть, но:

  • почему именно так работает?
  • как повторно отрендерить часть представлениябез потери привязок событий?
  • почему вызов myView.render() не потеряет привязки событий?

Обновление:

Найдено это статья.Это причина?

Убедитесь, что jQuery не выгружает ваши события, когда вы не хотите, чтобы это было

Если вы создаете приложение, где вы создаете представления на летуи прикрепите / удалите их в дом, у вас могут быть проблемы.Каждый раз, когда вы удаляете представление из dom, jQuery выгружает все события.Таким образом, вы не можете иметь ссылку на представление и удалить его из DOM, а затем повторно присоединить его позже.Все ваши события были бы выгружены.Если вы хотите сохранить представления вокруг, лучше спрятать их, используя display: none.Однако вам не следует злоупотреблять этим и перезапускать представления, которые вы не собираетесь использовать некоторое время (и предотвращать утечки памяти).

1 Ответ

18 голосов
/ 22 февраля 2012
События

jQuery empty, html и remove очищают все события jquery и привязки данных для предотвращения утечек памяти (вы можете проверить исходный код jQuery для метода cleanData, чтобы узнать больше - это недокументированноеmethod)

view.render() не удаляет события, поскольку события представления Backbone связаны с использованием делегирования события и привязываются к el представления, а не напрямую к элементам представления.

Если вы хотите повторно использовать ваши представления, вы можете удалить их, используя метод jQuery detach, который сохраняет все события и данные связанными, хотя вы должны следить за тем, чтобы не вызвать утечек памяти таким образом.( jquery detach docs )

Если вы хотите пойти первым путем, вы всегда можете легко перепривязать события Backbone, используя метод Backbone.View delegateEvents.( магистральный документ )

пс.Также чище и более оптимально использовать jQuery .empty(), а не .html(''), так как html-метод jQuery всегда сначала вызывает empty, чтобы очистить все события и данные, прежде чем вставить новый html.Также никогда не смешивайте jquery и собственный DOM innerHTML, так как это может привести к утечкам памяти из-за неочищенных событий / данных jQuery

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...