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 в обычных условиях?
Ответы
Ответ 1
Поскольку рассматриваемый плагин зависит от DOM, onRender
не будет делать то, что вам нужно. Этот обратный вызов запускается после отображения представления, но нет гарантии, что в el. На самом деле, вы в безопасности, полагая обратное, - что он еще не добавлен.
Если вы используете Marionette Region
, чтобы показать представление, вы можете реализовать метод onShow
в своем представлении. Этот метод вызывается регионом, после того как область добавила представление в DOM. Это было реализовано специально для решения этой проблемы.
Для получения дополнительной информации об этом и о работе с плагинами jQuery в целом см. это сообщение в блоге: http://lostechies.com/derickbailey/2012/02/20/using-jquery-plugins-and-ui-controls-with-backbone/