Почему события не стреляют после второго рендера в Backbone.js?

StackOverflow https://stackoverflow.com/questions/8307911

  •  25-10-2019
  •  | 
  •  

Вопрос

Я создаю приложение в Backbone.js, в котором есть родительский и несколько детей. Просмотры ребенка содержат ссылки, которые они слушают, и выполняют функцию.

Родитель хранит список всех детей. В функции рендеринга, после того, как она будет выполнена, вычисляет свой собственный HTML, он выполняет следующее:


$(this.el).html(html);
for (var i = 0; i < this.views.length; i++){
    $('.children', this.el).append(this.views[i].render().el);
}

Ответ: Проблема заключалась в том, что я создавал ссылку во время рендеринга. Т.е. на первом рендере (который был вызван от инициирования), событие успешно пришло к ссылке. Однако, поскольку все следующие вызовы рендеринга воссоздают весь элемент, новая ссылка не привязала к нему обработчика. Это было решено через раствор добавления @Tom TU this.delegateEvents() к рендере

Это было полезно?

Решение

Вы, вероятно, используете jQuery remove функционируйте где -нибудь, чтобы удалить подписания из представления - он автоматически удаляет все события, связанные с элементом (this.el) - устанавливается в events объект. Вы можете либо использовать this.delegateEvents() Метод визуализации подзадач после того, как вы визуализируете шаблон для повторения делегатов события, установленных в events объект или используйте jQuery detach метод вместо этого для удаления элементов из DOM без удаления связей событий (ссылка на сайт) А delegateEvents метод довольно дорогостоящий, и поэтому я бы порекомендовал detach Метод удаления элементов, которые вы хотите повторно использовать, если вы составляете длинные списки подзадач - не имеют значения, если это всего лишь пара просмотров.

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

Другие советы

Действительно распространенный вызов. Для будущих искателей этого вопроса, вот отличная статья о рендеринге View:

Вам просто нужно убедиться, что DelegateEvents призвана для переподключения событий в ваших подвесе в любое время .html (). А так как Backbone уже вызывает DelegateEvents, быстрое решение может выглядеть так ...

http://ianstormtaylor.com/rendering-views-in-backbonejs-isnt-always-simple/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top