Всем привет! Задача выглядит таким образом: во входящем дереве имеем некие блоки inner-one и inner-two. В шаблонах этих блоков оборачиваю их в блок wrapper примерно так:
block('inner-one')(
def().match(function() { return !this._innerInit })(function () {
var ctx = this.ctx;
return local({ _innerInit : true })(function() {
return applyCtx({
block : 'wrapper',
content : ctx
});
})
})
);
все отлично и прекрасно, если бы не одно но - в шаблоне wrapper-a для верстки имеем вот такой код
block('wrapper')(
match(function() { return this.isFirst(); })(
cls()('first')
)
);
Проблема оказалась вот в чем - во время достроения дерева позиция у inner-one имеет значение 1, а wrapper-у присваевается уже 2. Соответственно дополнительный класс не проставляется. Читал, что позиция учитывает преобразования дерева в шаблоне по пустой моде и моде content. Второй вариант отметаем сразу, с первым так и не смог разобраться. Пробовал использовать шаблон
block('inner-one')(
match(this._mode === '')(function () {
return applyCtx({
block : 'wrapper',
content : this.ctx
});
})
);
но получаю обратную вложенность, т. е. wrapper вложен в inner-one. Пока как временный хак сделал так
block('inner-one')(
def().match(function() { return !this._innerInit })(function () {
var ctx = this.ctx,
position = this.position - 1;
return local({ _innerInit : true })(function() {
return applyCtx({position : position}, {
block : 'wrapper',
content : ctx
});
})
})
);
но восторга он у меня не вызывает. Каким образом можно "по-правильному" обойти момент с позицией? Ну или вложить блок в другой в шаблоне по пустой моде?
Пока безотносительно позиции (по ней призываю @miripiruni) скажу, что оборачивать стоит с использованием
wrap()
:Кстати, какая версия
bem-xjst
(enb-bemxjst
) используется? Актуальная на данный момент —6.0
.Хм, enb-bemxjst версия 2.1.1, в package.json указана
"enb-bemxjst": "^2.0.2"
Проект создавал с помощью generator-bem-stubЕсть смысл обновить до 6.0.0
Обновился, спасибо за совет. Нашел более изящное решение - раз неправильная позиция у оборачивающего блока, значит правильная у оборачиваемого))) Пробросил в контексте, выглядит примерно так:
Так, кажется, уже лучше. Но все-таки с позицией вопрос остался открытым - ни wrap, ни обновление проблему с ней не решило
@const-l да, я в курсе про баг с position. Скоро его пофиксим https://github.com/bem/bem-xjst/issues/174