Возможно ли? Какова сигнатура передачи параметров?
В разделе Декларация блока / Клиентский JavaScript (i-bem.js) / Платформа / БЭМ ничего подходящего не увидел. Свои собственные попытки пока приводят к тому, что в создаваемом модуле модификатора блока отсутствуют добавляемые методы. Сейчас прообую лезть внутрь, смотреть, что происходит, пока хотелось бы убедиться, что не упустил ч.-ндь банального.
Как-то так:
// Примесь scrollableMixin:
modules.define('scrollableMixin', [ 'i-bem-dom' ], function(provide, BEMDOM) {
provide(BEMDOM.declMixin({ /*...*/ ));
});
// Модификатор с примесью
modules.define('box', [ /*...*/ 'scrollableMixin', /*...*/ ], function(provide, /*...*/ ScrollableMixin, /*...*/ Box) {
provide(Box.declMod({ modName : 'scrollable', modVal : true }, ScrollableMixin, { /*...*/ }));
});
UP: Вижу, что declMixin
вообще не предполагает передачу @param {Function|Array[Function]} [base] base block + mixes
. Как быть? Как-то inherit'ить перед delcMod
нужные модули самостоятельно?
Влез в
bem-core
, добавил функционал вi-bem:declMod
: declMod with mixins by lilliputten · Pull Request #1556 · bem/bem-core.UP Шайтан-автомат-again: Полтора часа не могу понять, в чём дело: Ситуация А -- блок без миксина:
Ситуация Б -- блок с миксином:
В первом случае всё предсказуемо -- не вижу методов, определённых в миксине, но всё остальное работает.
Во втором -- вижу методы из миксина, но отсутствует функционал из
i-bem-dom
(find*
, напр).ЧДНТ? В случая рядом вижу, как примешивается блок (кажется, нет разницы, как определяется: через
declBlock
илиdeclMixin
) и всё работает нормально. Пока не могу разглядеть, в чём разница между этими двумя случаями. В чём может быть дело? Куда смотреть в первую очередь?UP-UP: Причина найдена: Декларация блока с чистыми примесями. · Issue #1483 · bem-site/bem-forum-content-ru
@veged В связи с этим -- declMod with mixins by lilliputten · Pull Request #1556 · bem/bem-core -- выходит, нет кейса, чтобы для модификатора добавить миксины, расширяющие поведение?
прямо сейчас это невозможно, да
лучше проектировать проще, т. к. в конструкции с миксинами к модификаторам возникает масса проблемных моментов (усложняется вся конструкция)
Как-то вот выходит, что когда сложнее, тогда проще. :()Закрываю, пока пользуюсь своим патчем. :((
@veged Приоткрою слегка обратно: Нет возможности сделать к.-то workaround, чтобы обходиться без чреватых в будущем взломов? -- Ну, напр., вручную перед
provide(*.declMod(...))
подмешивать в передаваемое необходимый функционал (при помощиinherit
, видимо)? Т.е., не передавая примеси вdeclMod
, а самому выполнять всю грязную работу?(Сейчас сообразил, что, наверное, можно раскрутить взад то, что делает
declMod
и делать это же ручками или вынести в своё доопределениеi-bem-dom
-- всё равно у меня там уже ряд вещей болтается -- как-то так, да?)можно попробовать реализовать доопределение или прямо патч прислать, да — но я заранее призываю подумать про всякие сложные случаи
повторюсь, мнение нашей команды авторов (понимающих из первых рук какие есть варианты реализации) склоняется к тому, что лучше без этого — как минимум, чтобы полноценно это реализовать нужно все методы миксуемого класса (включая наследованные) завернуть в условную функцию от модификатора, а ещё есть проблема приоритетов (между миксинами и декларациями самой сущности на разных уровнях) и это ещё я не всё вспомнил ;-) в общем https://lurkmore.net/Копипаста:Не_стоит_вскрывать_эту_тему ;-)