Некоторые из моих представлений нуждаются в преобразовании текстовых полей в редакторы форматированного текста.
Я использую jwysiwyg в качестве редактора.Требуется, чтобы элемент, к которому он присоединяется, находился на странице при инициализации редактора, т.е. когда я вызываю $ (this.el) .wysiwyg (), this.el уже находится в документе.
Большинствоиз моих представлений на самом деле не привязываются к dom - их методы рендеринга просто устанавливают html-контент своих элементов с помощью механизма шаблонов приложений, например, $ (this.el) .html (this.template (content)
Views /Контроллеры дальше по цепочке выглядят после фактической вставки этих дочерних представлений на страницу. В то же время представления изменяют свои представления при изменении их моделей.
Как убедиться, что редактор присоединен к элементукаждый раз, когда он визуализируется и все еще гарантирует, что редактор не присоединен, пока элемент уже не находится на странице?
Очевидно, я мог бы взломать что-то вместе, что сработало бы в этом конкретном случае, но я хотел бы элегантное решение, которое будетработа для всех случаев.
Любая помощь будет высоко ценится.
Редактировать: Сутьв данном случае решение должно изящно масштабироваться, чтобы охватить несколько элементов, которые должны быть стилизованы после рендеринга, и не должны быть стилизованы до тех пор, пока они не будут в DOM
Редактировать: это не проблема, если я выполняю рендеринг сверху вниз, ноэто медленно, я хотел бы найти решение, с помощью которого я могу рендерить снизу вверх, а затем вставить полный вид за один раз сверху
Редактировать:
Используя комбинацию некоторых изметоды, предложенные ниже, я думаю сделать что-то вроде следующего.Любые комментарии / критика будут оценены.
app/views/base_view.js:
initialize: function() {
// wrap the render function to trigger 'render' events
this.render = _.wrap(this.render, function() {
this.trigger('render')
});
// bind this view to 'attach' events.
// 'attach' events must be triggered manually on any view being inserted into the dom
this.bind('attach', function() {
this.attached();
// the refreshed event is only attached to the render event after the view has been attached
this.bind('render', this.refreshed())
// each view must keep a record of its child views and propagate the 'attach' events
_.each(this.childViews, function(view) {
view.trigger('attach')
})
})
}
// called when the view is first inserted to the dom
attached: function() {
this.style();
}
// called if the view renders after it has been inserted
refreshed: function() {
this.style();
}
style: function() {
// default styling here, override or extend for custom
}