Подтвердить что ты не робот

Backbone.Marionette onRender вызывает обратный вызов перед представлением в браузере?

Настройка

У меня есть Backbone.Marionette.ItemView, который отображает некоторый контент. Когда содержимое отображается, я хотел бы применить плагин jQuery, который превращает часть представления в контейнер с полосой прокрутки.

Полоса прокрутки полностью реализована в javascript, и при ее инициализации она должна проверять высоту контейнера прокрутки, а также содержимого содержимого внутри контейнера.

Если содержимое выше, чем контейнер, необходимо включить полосу прокрутки.

Проблема

Пока все звучит просто, у меня возникла странная проблема:

Если я инициализирую свой плагин прокрутки прямо в обратном вызове onRender, кажется, что элемент .scroll-container имеет высоту 0 и maxHeight 0.

Если я завершу код инициализации внутри тайм-аута 0ms, но все работает так, как должно, свойство высоты элемента .scroll-container вернулось jQuery правильно, и плагин плагина прокрутки отлично работает.

Код

onRender: function() {
  var that = this;
  setTimeout(function() {
    that.onLayout();
    var $scrollContainer = that.$el.find('.scroll-container'), 
        scrollPane = new ScrollPane($scrollContainer, {
          maxHeightProperty: 'maxHeight',
          scrollUpButton: false,
          scrollDownButton: false
        });
  }, 0);
},

Вопрос

Я предполагаю, что проблема возникает, потому что браузер не закончил фактически рендеринг недавно вставленного html, когда выполняется обратный вызов onRender.

Правильно ли это предположение? И если да, то является ли мое решение использовать тайм-аут 0ms в обычных условиях?

4b9b3361

Ответ 1

Поскольку рассматриваемый плагин зависит от DOM, onRender не будет делать то, что вам нужно. Этот обратный вызов запускается после отображения представления, но нет гарантии, что в el. На самом деле, вы в безопасности, полагая обратное, - что он еще не добавлен.

Если вы используете Marionette Region, чтобы показать представление, вы можете реализовать метод onShow в своем представлении. Этот метод вызывается регионом, после того как область добавила представление в DOM. Это было реализовано специально для решения этой проблемы.

Для получения дополнительной информации об этом и о работе с плагинами jQuery в целом см. это сообщение в блоге: http://lostechies.com/derickbailey/2012/02/20/using-jquery-plugins-and-ui-controls-with-backbone/