Как отсоединить и затем подключить Backbone.View без отмены привязки событий? - PullRequest
8 голосов
/ 01 декабря 2011

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

  1. Отсоединить дочернее представление от DOM
  2. Повторно отобразитьродительское представление с нуля (из шаблона)
  3. Повторное присоединение дочернего представления в правильном месте

Я делаю это, вызывая что-то вроде $(parent.el).html(...) и затем $(parent.el).append(child.el)

Что я всегда видел в этой технике, так это то, что обработчики событий на дочернем объекте теряются.Итак, я попробовал несколько вещей, ни одна из которых до сих пор не работала.

  1. Сначала отсоедините child.el с помощью $.detach()
  2. Клонирование узла child.el и повторное подключениеклон
  3. Повторный вызов child.delegateEvents () после повторного присоединения

Единственное, что мне подходит, - это полная перестройка дочернего представления с нуля.У кого-нибудь есть какие-либо идеи?Повторное подключение существующего узла будет гораздо более эффективным.

Спасибо!

Ответы [ 3 ]

3 голосов
/ 10 января 2013

У меня просто была похожая проблема.Мне показалось, что это работает:

this.undelegateEvents();
this.$el.hide();
this.$el.detach();

// do whatever here

this.$el.appendTo(containerElement);
this.delegateEvents();
this.$el.slideDown('fast');

Я все еще не совсем уверен почему слушатели событий исчезают, хотя я могу подтвердить, что они на самом деле пропали, когда я смотрю в Chrome Developerокно инструментов.Это странно, потому что у Роатин Март есть пример (http://jsfiddle.net/Xcrhb/1), где эта проблема не возникает.

1 голос
/ 12 ноября 2015

Я делаю точно так же.

// First of all pre-render child view
childView.render();

// Append in one place
parentView.$el.append(childView.el);

// Detach in another place
childView.$el.detach();

// And append it again
parentView.$el.append(childView.el);
0 голосов
/ 27 июня 2012

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

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

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