EDIT3: Внимание! Этот ответ может быть устаревшим. Я получил комментарий, что этот ответ больше не работает, и у меня не было времени для расследования (я лично не использую этот метод).
Я хотел бы использовать Twitter/Bootstrap в моей библиотеке UI и возникли некоторые проблемы с моделированием таблицы из-тегов по умолчанию обертывания (конкретно <div>
между моими <tbody>
и моими <tr>
с).
После некоторого рытья я нашел что-то в документах Marionette на Region
около how the View
attaches the el
. Backbone builds the el
из различных атрибутов View
и сохраняет встроенный элемент в актуальном состоянии, чтобы его можно было визуализировать в любое время. Поэтому я решил, что если view.el
является родительским, почему бы просто не использовать содержимое HTML? Marionette также предоставляет способ: create a custom Region
Мне удалось запустить все, создав пользовательский Region
с переопределенной функцией open
. Таким образом, я могу указать, какие области я хочу обернуть тегом, а те, которые у меня нет. В следующем примере фрагмента я создаю свой собственный неинтегрирующий Region
(NowrapRegion
) и использую его в своих Layout
(MyLayout
) для моих <tbody>
(виды, которые я передаю в своей реальной программе, создают <tr>
).
var NowrapRegion = Marionette.Region.extend({
open: function(view){
this.$el.html(view.$el.html());
}
});
var MyLayout = Marionette.Layout.extend({
template: templates.mylayout,
regions: {
foo: '#foo',
columns: '#columns', //thead
rows: { selector: '#rows', regionType: NowrapRegion } //tbody
}
});
BOOM! Обертывание, когда я этого хочу, и нет, когда я этого не делаю.
EDIT: Это, кажется, влияет на events
, применяемый на уровне *View
. Я еще не изучил его, но предупреждаю, что они, похоже, не срабатывают.
Является ли это «правильным» способом сделать это или нет, я не уверен. Я бы приветствовал любые отзывы от @ derick-bailey, если он это увидит.
EDIT2: @ chris-neale предложил следующее, я еще не подтвердил это, но кажется, что это звучит. Благодаря!
Вместо того, чтобы скопировать HTML в представлении, используя глубокий клон на дочерних узлов будут поддерживать события и данные.
var NowrapRegion = Marionette.Region.extend({
open: function(view){
view.$el.children().clone(true).appendTo(this.$el);
}
});
Есть ли способ марионетки для этого? Предпочтительно, я думаю, было бы неплохо использовать атрибут «template» – streetlight
Отлично. Мне очень не нравятся все те другие ответы, которые я вижу, чтобы манипулировать DOM для решения этой проблемы. Почему, когда вы можете просто setElement()? – trusktr