Имеется блок chart с элементом legend. как можно вызвать методы элемента в ymodule?
Каждая диаграмма содержит элементы(заголовок, легенда,график и тд)
Хочу создать блок для диаграмм у которого в роле элементов выступают как раз элементы(заголовок, легенда,график и тд)
В элементе легенды хочу сделать статический метод что то вроде js render()
а из блока chart вызывать его.
может где то я не прав в методолгоии и нужно реализовывать легенду отдельным блоком?
chart.js
modules.define('chart', ['i-bem__dom','d3','BEMHTML'], function (provide, BEMDOM, D3, BEMHTML) {
provide(BEMDOM.decl(this.name, {
onSetMod: {
js: {
inited: function () {
this._graphic = this.findElem('graphic'); //Находим елемент графика
this._legend = this._elem('legend'); //Находим елемент легенды
this._cdata = this.params.data; //предварительная обработка входящих данных
this._legend.someMethod() // Ругается что не существует метод
}
}
}
}));
});
legend/chartlegend.js
modules.define('chart', ['i-bem__dom','d3'], function(provide, BEMDOM, D3) {
provide(BEMDOM.decl(this.name, {
onSetMod: {
js: {
inited: function(){
this.__base.apply(this, arguments); // тут не понятно немножко момент № 1
console.log("chart_legend inited");
}
}
},
someMethod: function() {
console.log("chart_legend generate");
return "911";
},
}));
});
обязательно js-модуль дефайнить как блок? если так делать то модель элемента поавторитетней модуля блока, поэтому нужно this.__base.apply() вызывать?!
И немножко не по теме, почему то в таком контексте(chart.js) не срабатывает js BEMHTML.apply({block:'someblock',content:'someContent'});
- ничего не возвращает.
В текущей версии
i-bem.js
у элемент не предусматривается собственная JS-реализация, вся работа с элемента происходит от лица родительского блока. Поддержка JS для элементов появится вbem-core v4
, а до релиза стоит объявить необходимые методы на родителе. И да, если они опциональны и описываются в отдельном файле, то необходимо звать__base()
.Предположу, что дело в недостающих зависимостях. Подробнее см. https://ru.bem.info/technology/deps/about/#Подключение-зависимостей-по-технологии
ок, с нетерпением буду ждать обновлений! правильно ли будет типы диаграмм делать как элементы блока диаграммы? что лучше для каждого типа(круговая, линейная) диаграмм делать отдельный блок и доопределять базовый блок? в элементе __legend доопределить блок chart будет лучше? как то так
Вообще без погружения в детали кажется, что типы хорошо ложатся на модификаторы основного блока, а не на элементы.
согласен с вами! просто меня немного смутило что js-реализация блока (chart) будет слишком громоздкой, а если в элементы разложить js и stylus файлы то как то упорядоченно будет.
так модификаторы тоже можно разносить в отдельные файлы, при этом у них уже сейчас честная отдельная декларация (см. https://ru.bem.info/technology/i-bem/v2/i-bem-js-decl/#Добавление-модификатора-к-блоку)
Модификаторы блока надо еще где нибудъ декларировать кроме js-реализации блока? bemjson
chart.js
Я в предыдущем комментарии давал ссылку на декларацию модификаторов.
Поле
onSetMod
— это реакция на переключение модификатора в рантайме (https://ru.bem.info/technology/i-bem/v2/i-bem-js-mods/#Триггеры-на-установку-модификаторов), а здесь, насколько я понимаю задачу, необходимо описать разную реализацию методов в зависимости от заранее заданного модификатора (https://ru.bem.info/technology/i-bem/v2/i-bem-js-decl/#Добавление-модификатора-к-блоку).В итоге должно получиться что-то типа:
Ссылки на декларацию сразу читать начал, но проблема в том что модификаторы не схватывает. в теории если я в BEMJSON укажу
mods:{type:'donut'}
то могу повешать обработчик(триггер) onSetMod на type? в обработчике поставил console.log('tratata'); и ничего не происходит!если модификатор описан в отдельном файле, то, возможно, не хватает его указания в
deps.js
, чтобы он попал в сборку?нет, коллбеки из
onSetMod
отработают только если модификатор будет переключен в рантайме с помощьюthis.setMod('type', 'donut')
. но это не должно быть нужно.если я правильно понимаю задачу, то в зависимости от типа, должна быть разная реализация какого-нибудь метода, типа
render
. его «заглушку» можно объявить вchart
, а в модификаторах описать конкретную реализацию.