Войти с помощью github

Пользуюсь dist-сборкой bem-components. Подключил себе на страницу стили с CDN и генерирую html сам.

Сейчас обнаружил, что button не меняет свое состояние по hover и click, поскольку эти стили задаются через отдельные классы а не псевдоклассы :hover и :active. Почему вы их не используете? Намного проще сделать это поведение на чистом css без необходимости навешивать обработчики на javascript.

В Bootstrap так и сделано, на кнопку можно добавить класс .active который содержит те же стили, что и :active

Если сделать BEMDOM.destruct(this.elem('some-elem')), то элемент всё равно остаётся в кеше. Не могу понять, баг это или фича.

Пока делаю первое тестовое задание и сразу возникает вопрос. Как понять в каком месте кода возникает ошибка? Из того, что выдает страничка, мне сложно сделать какие-то выводы.

Собственно сообщение об ошибке:

SyntaxError: Unexpected token { at exports.runInThisContext (vm.js:53:16) at Module._compile (module.js:413:25) at Object.Module._extensions..js (module.js:452:10) at Module.load (module.js:355:32) at Function.Module._load (module.js:310:12) at Module.require (module.js:365:17) at require (module.js:384:17) at doRequire (C:\Users\nut707\Desktop\test-project\node_modules\enb-bem-techs\node_modules\enb-async-require\lib\async-require.js:23:30) at C:\Users\nut707\Desktop\test-project\node_modules\enb-bem-techs\node_modules\enb-async-require\lib\async-require.js:35:9 at Object.Promise (C:\Users\nut707\Desktop\test-project\node_modules\enb-bem-techs\node_modules\vow\lib\vow.js:308:9)

Приветствую! Где должны располагаться стили и какое должно быть имя файла, чтобы собрался файл index.ie.css?

А есть ли к методу BEMDOM.init обратный? Чтобы рекурсивно в DOM дереве занулить модификаторы js

Возможно ли обычное наследование (через baseBlock) от нескольких блоков? Похоже нет, но может есть workaround?

Что будет, если блоку унаследованному от базового, указать свой baseBlock в модификаторе? Например: {block: 'link', baseBlock: 'control'}, {block: 'link', modName: 'overrided', modVal: 'custom', baseBlock: 'another-base-block'}

Подскажите, на что будет указывать this.prototype в статических методах блока? Заинтересовала такая конструкция:

live : function() {
        this.liveBindTo('control', 'pointerclick', this.prototype._onPointerClick);
        return this.__base.apply(this, arguments);
    }

upd: Да, главное то не спросил! будет ли работать такая конструкция:

  someStaticMethod: function(){
      somePromise.then(
          this.prototype.blockMethod,
          this
      );
  }

Тут такое дело.

Тесты тестами, но их тоже пишут люди.

По этому частенько возникает идея через *.deps.js показать область affected.

Т.е. правлю я блок и выполняя какую-то команду enb make affected app/common.blocks/core/ - как-то вывести те блоки, которые зависят от этого.

Таким образом можно дать возможность понять, область где нагадили своим рефакторингом.

Может уже нечто подобно есть?

А есть какой-то хороших способ без танцев с бубном подготовить БЭМ-фулстек проект с Express API на бэкэнде к индексированию поисковиками? (https://yandex.ru/support/webmaster/robot-workings/ajax-indexing.xml)

Добрый день, Подскажите пожалуйста что именно может влиять в настройках видео карты на прохождение тестов, т.к новый написанный тест проходит удачно на машинах у которых видеокарты одинаковые и падают с огромной разницей если видеокарта отличаться от того пс на котором делали бейз скрин.

Спасибо, Слава

cc @blond @awinogradov

У объекта event, который приезжает в обработчик БЭМ-события первым элементом, есть методы preventDefault() и stopPropagation(), но если вызвать e.stopPropagation() в обработчике на вложенном блоке, то событие всё равно всплывает в родительский.

Сейчас проверяю в обработчике в родительском блоке

someEvenHandler(e, data) {
    if (! e.isPropagationStopped()) {
        this.doSomething();
    }
}

Но насколько это всё правильно?

Здравствуйте! Нужна помощь по настройке bem-grid. Делаю все как написано здесь https://github.com/bem-incubator/bem-grid Но в результате стилей в браузере нет. enb make отрабатывает без ошибок. Я понимаю, что дело в настройке, но информацию по этой теме найти не могу. На форуме подобная тема есть. В конце отписались, что заработало а что сделали ни слова. Если есть у кого инструкция или статья по настройке, буду благодарен и думаю в дальнейшем не только я.

Здравствуйте!

Возможно ли изменение параметров блока в js-реализации другого?

К примеру, есть блок list с элементами item. У каждого элемента есть параметры id и name.

{
    block : 'list',
    elem : 'item',
    content : name,
    js : {
        id : id,
        name : name,
    }
}```

При клике на `item` я подгружаю соответствующий контент в основной блок на странице.
Меняю там название `name`, сохраняю на сервере, так же хотелось бы обновить элемент списка `list`.
Как мне найти нужный элемент списка, как изменить его параметры?

Есть ли возможность клонировать блок? Аналог jQuery.clone() для блока.

Хочется сделать такой шаблон BEM-сборки, который бы легко интегрировался в код сайта (с точки зрения программиста) и был оптимизирован в плане подключенных CSS/JS файлов. Речь про CMS 1С-Битрикс у которой своя система сборки/объединения статики. Вариант с merged-бандлами не рассматриваем. Для сборки используем enb + bh.

По факту нужно следующее: а) для каждой БЭМ-сущности понять перечень необходимых для ее работы статических ресурсов (включая зависимости) б) этот самый перечень включить в виде HTML-комментария в результирующей HTML непосредственно перед БЭМ-сущностью (чтобы программист знал какие файлы нужно подключить для каждого кусочка HTML)

Пример для bemjson:

{
    block : 'bl-1',
    content : [
        {
            elem : 'elem-1',
            mix : { block : 'bl-2' },
            content : [ ... ]
        }
    ]
}

получить html:

<!--
../../desktop.blocks/bl-1/bl-1.css 
../../desktop.blocks/bl-1/bl-1.js
-->
<div class="bl-1">
        <!--
        ../../common.blocks/jquery/jquery.js 
        ../../desktop.blocks/bl-1/__el-1/bl-1__el-1.js 
        ../../desktop.blocks/bl-2/bl-2.css 
        -->
    <div class="bl-1__el-1 bl-2">...</div>
</div>

Какой вариант вижу я сам: вклиниться в генерацию HTML (BH.apply), вычислять для каждого блока (с учетом миксов), генерировать комментарий и добавлять его в HTML.

Вопросы которые хочу задать:

  1. Есть ли более светлые идеи как сделать описанную задачу?
  2. Есть ли какая-то enb-технология которую можно взять за основу? Особо интересует вычисление CSS/JS необходимых для произвольного узла bemjson

Склонировал репозиторий project-stub, добавил новую технологию sass, создаю новый блок - все нормально.

Запускаю команду создания блока node_modules/.bin/bem create -l desktop.blocks -b social создается папка и в ней находится файл только что добавленной технологии

Вопрос: Как мне скомпилить sass в css и подключить вместе с блоком

Добрый день! При запуске bem server и переходе по ссылке http://0.0.0.0:8080 выдает ошибку

17:21:43.279 - [rebuild] [desktop.bundles/index/index.bemjson.js] file-provider 17:21:43.307 - [failed] [desktop.bundles/index/index.levels] levels 17:21:43.308 - [failed] [desktop.bundles/index/index.files] files 17:21:43.308 - [failed] [desktop.bundles/index/index.deps.js] deps 17:21:43.308 - [failed] [desktop.bundles/index/index.bemhtml.files] files 17:21:43.308 - [failed] [desktop.bundles/index/index.bemhtml.deps.js] deps 17:21:43.309 - [failed] [desktop.bundles/index/index.bemhtml.bemdecl.js] deps-by-tech-to-bemdecl 17:21:43.309 - [failed] [desktop.bundles/index/index.bemhtml.js] bemhtml 17:21:43.309 - [failed] [desktop.bundles/index/index.css] stylus 17:21:43.309 - [failed] [desktop.bundles/index/index.browser.js] browser-js 17:21:43.309 - [failed] [desktop.bundles/index/index.browser.bemhtml.js] bemhtml 17:21:43.311 - [rebuild] [desktop.bundles/index/index.bemdecl.js] bemjson-to-bemdecl 17:21:43.312 - [failed] [desktop.bundles/index/index.html] bemjson-to-html 17:21:43.312 - [failed] [desktop.bundles/index/index.min.css] borschik 17:21:43.312 - [failed] [desktop.bundles/index/index.pre.js] file-merge 17:21:43.313 - [failed] [desktop.bundles/index/index.js] prepend-modules Error: ENOENT: no such file or directory, scandir '/home/dbimok/Документы/bem-new/libs/bem-core/common.blocks' at Error (native) at Object.fs.readdirSync (fs.js:813:18) at module.exports.inherit.load (/home/dbimok/Документы/bem-new/node_modules/enb-bem-techs/lib/levels/level.js:212:28) at /home/dbimok/Документы/bem-new/node_modules/enb-bem-techs/techs/levels.js:110:38 at Array.map (native) at /home/dbimok/Документы/bem-new/node_modules/enb-bem-techs/techs/levels.js:109:42 at Array. (/home/dbimok/Документы/bem-new/node_modules/enb/node_modules/vow/lib/vow.js:202:56) at Immediate.callFns as _onImmediate at processImmediate as _immediateCallback

В чем может быть проблема?

На видеосеминарах в большинстве случает используется project-stub. Когда Гаврюшин презентовал generator-bem-stub, то он сказал, что данная сборка универсальна и предпочтительнее. Почему же вы не используете её на вебинарах? И в чем разница?

Не помню, чтобы хотя бы один проект установился у меня без проблем. Работаю на Linux Mint 16. Есть ли какое-то руководство по решению проблем связанных с установкой?

Вот список некоторых проблем с которыми я сталкиваюсь:

  1. Клонирование через http не проходит использую только git clone https...
  2. Установка проходит обычно с sudo ... а без него какая-нибудь директория оказывается недоступной.
  3. В процессе вываливается ошибка типа Error: Cannot find module.
  4. Текущая версия nodejs конфликтует.

На всех видео семинарах, что я смотрел ваши сотрудники ставят проекты с пол пинка. Мне же приходится "рожать" каждую установку. Хотя у меня установлены все менеджеры пакетов типа npm и bower и прочие пакеты, которые я установил глобально. Все равно установка спотыкается.

Ставил несколько сборок и заметил, что после всех npm install и подобных команд не устанавливаются библиотеки bem-core и bem-components. Ставлю вручную, работает. Хотя в generator-project-stub выбираю установить bem-components.

Второй вопрос. Можно ли один раз скачать библиотеки, а потом просто указывать путь до них? Если да, то в какой файл и как правильно прописать путь, дабы экономить время и место?

Научился немного ставить сборки и писать маленькие блоки на БЭМ. Теперь думаю как разобраться с большим объемом кода. Для этого хотел бы посмотреть страничку с исходными файлами для разработки, чтобы посмотреть как все реализовано изнутри. Пока не могу понять. Если описывать каждый тег в bemjson потом в bemhtml кажется очень объемно.

Есть у меня тут в сборке одна интересная задача.

Сборка бандлов по одному модулю не может полноценно пройти без сборки других бандлов.

Так вот

Есть ли возможность у enb указать чтобы сборка одних бандлов проходила только после других?

В стандартном project-stub не указано что можно создать папку в desktop.bundles/*/blocks и блок оттуда подтянется. Где это поведение по умолчанию можно изменить?

На данный момент у меня в этой папке лежат блоки релевантные текущему бандлу. Хочу настроить сборку только этих блоков в отдельные технологии css и js.

Не пропустите наш опросник, пожалуйста!

В приложении типа чат есть два списка: список общих комнат и список приватных бесед. Реализовал их блоком list с соответствующим модификатором type.

Задача: реализовать выбор одного элемента из списка. Проблема: каждый инстанс блока list запоминает свой активный элемент списка.

// При клике на элемент списка ставлю соответствующий модификатор
_onItemClick : function (e) {
    var item = $(e.currentTarget);
    var type = this.getMod(item, 'type');

    this.setMod(item, 'current', true);
}

// При выставлении модификатора новому элементу, удаляю модификатор у предыдущего
onElemSetMod : {
    'item' : {
        'current' : {
            'true' : function (elem) {
                this.delMod(this._current, 'current');
                this._current = elem;
            }
        }
    }
}

Как грамотнее всего реализовать, чтобы при выборе одного элемента удалялся модификатор не только в текущем инстансе блока, а во всех списках?

Так же интересует насколько правильной является реализация "оборачивания" всех элементов списка в контейнер с помощью создания нового элемента container

// BEMJSON
{
    block: 'list',
    mods: { 'type' : 'channels' },
    content: [
        { elem: 'title', content: 'Каналы' },
        { elem: 'container' }
    ]
}

// BEMHTML
block('list').elem('container').tag()('ul');

// JS-реализация загрузки данных в список
_getListData : function (type) {
    var container = this.elem('container');

    API.get('channels.list', { type: type }).then(function (data) {
        var channels = data.channels;

        channels.forEach(function (channel) {
            BEMDOM.append(container,
                BEMHTML.apply({
                    block : 'list',
                    elem : 'item',
                    mods : { type : type },
                    content : channel.name,
                    js : {
                        id : channel.id,
                        name : channel.name
                    }
                })
            );
        });
    });
}

Спасибо!

Есть в bem-components модальное окно https://ru.bem.info/libs/bem-components/v2.3.0/touch/modal/examples/ Каким образом можно создать его налету и запихнуть скажем контент из скрытого дива?

С удовольствием посмотрел запись выступления Владимира :). Для себя услышал одну очень простую, казалось бы, фразу, но упрощающую очень сильно понимание bemhtml.

До этого я пытался с ним работать, но выбор пал на сторону bh.

А вот вчера вечером, смотря запись услышал: "Это то же самое, что CSS". @tadatuta показал как они похожи и по какой логике работает bemhtml. После этого у меня прояснилось в голове и появилось желание использовать именно данный шаблонизатор.

Спасибо за удачное сравнение :) Мне его не хватало.

Всем привет! Осваиваю методологию BEM и хочу внедрить её в наши проекты. Мы используем gulp и не хотим от него отказываться, поэтому решил попробовать gulp-bem, но столкнулся с не понимаем того как работаем этот модуль. На гите есть пример: var gulp = require('gulp'); var bem = require('gulp-bem'); var concat = require('gulp-concat');

var levels = ['base', 'blocks']; var tree = bem(levels);

tree.deps('blocks/page') .pipe(bem.src('{bem}.css')) .pipe(concat('index.css')) .pipe(gulp.dest('./dist'))

Вот тут всё понятно: var levels = ['base', 'blocks']; var tree = bem(levels);

А вот тут возникла сложность: tree.deps('blocks/page') Что делает этот код? Спасибо!

Задача такая, кликнул человек по кнопке редактировать и рядом стоящий div меняется на input