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

Настройка

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

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

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

Проблема

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

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

Однако, если я заключу код инициализации в тайм-аут 0 мс, все будет работать как надо, свойство высоты элемента контейнера.scroll -правильно возвращается 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.

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

29
задан Ruben Ray Vreeken 8 August 2012 в 23:10
поделиться