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

Допустим есть блок menu с элементами menu__item. Как обернуть все menu__item в блок wrapper, используя bemhtml, чтобы не писать это в BEMJSON ручками.

Имеем:

    {
        block: 'menu',
        content: [
            { elem: 'item', content: 'item 1' },
            { elem: 'item', content: 'item 2' }
        ]
    }

Хотим:

    {
        block: 'menu',
        content: [
            {
                block: 'wrapper',
                content: [
                    {    block: 'menu', elem: 'item', content: 'item 1' },
                    { block: 'menu', elem: 'item', content: 'item 2' }
                ]
            }
        ]
    }

Такое возможно?

UPD: Опубликовали видео с митапа https://www.youtube.com/watch?v=o1MeyEvpDTg

11 августа в 19:00 в питерском офисе Яндекса пройдет еще один митап по БЭМ!

Сергей Бережной проведет мастер-класс по использованию bem-react-core — библиотеки, расширяющей возможности React. Вы получите возможность изменять любые аспекты поведения компонентов без добавления лапши из if-ов в коде. В точности так, как это делается в CSS.

Вы сможете:

  • Создать компонент с разным набором признаков (в том числе и с разной разметкой!).
  • Дешево проводить AB-тестирование и эксперименты.
  • Настраивать компонент под окружение/платформу, переиспользуя общий код.

Кроме того, мы ответим на любые ваши вопросы, связанные с БЭМ и работой фронтендера в Яндексе.

По традиции вы можете задать вопросы заранее в комментариях к этому посту, а мы постараемся подробно ответить на них во время митапа.

Участие, как всегда, бесплатно, но количество мест в зале ограничено, так что успейте зарегистрироваться! Мы просматриваем все заявки вручную, поэтому ответ с приглашением может прийти с задержкой.

Регистрация открыта!

Stay BEMed!

Добрый день. Нужна оценка корректности БЭМ нейминга на данной странице: http://portfoliome.ru/demo/portland/ Верное ли наименование классов, использование миксов и тд?

Имеем input[type=file] на котором событие change (сделано по БЭМ, естествен) Хотим: загрузить данный файл с помощью AJAX еще до сабмита формы.

inputFiles._domEvents().on('change', function(e) {
  console.log(e);  // Есть bemTarget._val который  содержит путь к файлу, но console.log(e.bemTarget._val) возвращает пустую строку
  console.log(e.files);  // undefined
});
// inputFiles = findChildBlock({ block: Input, modName: 'type', modVal: 'file' })

Подскажите, как это реализовать?

Для начинающих хочу порекомендовать отличный ресурс http://webdiz.com.ua/uroki/css

Есть страница: / index.bemjson.js /

module.exports = {
    block: 'page',
    ...
    content: [
        {
            block: 'menu',
            mods: {
                theme: 'islands',
                size: 'm',
                mode: 'radio'
            },
            content: [
                {
                    elem: 'item',
                    content: 'Отдых в горах'
                },
                {
                    elem: 'item',
                    content: 'Отдых на море'
                }
            ]
        }
    ]
};

После построения, появляется блок menu -> в нем элементы item, но у них нет uniq и не меняются модификаторы (checked, hovered), так же отсутствует класс i-bem, атрибут data-bem . Причем у блока menu появляется class i-bem, модификаторы, uniq и т.д. У кнопок так же все функционирует и работает, а вот menu__item не хочет работать. В либе ошибочка?(

Код бандла index.bemjson.js выглядит следующим образом: index.bemjson.js

module.exports = {
    block: 'page',
    title: 'Title of the page',
    favicon: '/favicon.ico',
    head: [
        { elem: 'meta', attrs: { name: 'description', content: '' } },
        { elem: 'meta', attrs: { name: 'viewport', content: 'width=device-width, initial-scale=1' } },
        { elem: 'css', url: 'index.min.css' }
    ],
    scripts: [{ elem: 'js', url: 'index.min.js' }],
    mods: { theme: 'islands' },
    content: [
        {
            block: 'header',

        }
    ]
};

В блоке header, в файле header.deps.js я устанавливаю зависимость вида:

({

    shouldDeps: [
        {
            block: 'logo',
            mods: {theme: 'sea'}
        }
    ]
})

Соответственно блок лого существует, и у него прописаны стили. Но при сборке проекта блок header не содержит никакой вложенности. Соответственно вопрос: как добавить вложенность? Или это так не должно работать, и в любом случае в index.bemjson.js должен быть явно прописан блок внутри блока?

Добрый день!

Подскажите, пожалуйста как правильно подключить скрипт по URL используя loader. Посмотрел для примера принцип подключения jQuery и сделал по аналогии, но скрипт не подключается. Не могу разобраться что я упустил.

dropzone.deps.js:

({
    mustDeps: [ 'i-bem-dom' ],
    shouldDeps: [
        { block: 'loader', mods : { type : 'js' } },
        { elem: 'config' },
        { mods: { theme: ['islands', 'default'], size: ['s', 'm', 'l', 'xl'], width: ['available'] } },
    ]
})

dropzone.bemhtml.js:

block('dropzone')(
    tag()('form'),
    attrs()({ action: '/post' }),
    addJs()(true)
);

dropzone__config.js:

/**
 * @module dropzone__config
 * @description Configuration for Dropzone
 */

modules.define('dropzone__config', function(provide) {

    provide(/** @exports */{

        /**
         * URL for loading Dropzone (http://www.dropzonejs.com)
         * @type {String}
         */
        url: 'https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.1.1/dropzone.js',
    });

});

dropzone.js:

/**
 * @module dropzone
 */
modules.define('dropzone', ['i-bem-dom', 'loader_type_js', 'dropzone__config'],

    function(provide, bemDom, loader, cfg)
    {
        const Dropdown = bemDom.declBlock(this.name, {

            /**
            * On modifier set
            * callback functions
            */
            onSetMod: {

                js: {

                    /**
                    * @param modName
                    * @param modVal
                    * @param currentModVal
                    */
                    inited() {

                        console.log('Dropzone - inited()');

                    }
                }
            },

        }, {
            lazyInit: false,

            onInit() {

                console.log('Dropzone - onInit()');
                return this.__base.apply(this, arguments);
            },

        });

        function doProvide(flag = 'defined')
        {
            console.log('Dropzone - doProvide(' + flag + ')');
            provide(Dropzone);
        }

        typeof Dropzone !== 'undefined' ? doProvide('undefined') : loader(cfg.url, doProvide);

    }
);

console.log:

Dropzone - doProvide(defined)
Dropzone - onInit()
Dropzone - inited()

Запутался с асинхронным тестированием.

Делаю что-то вроде:

modules.define('spec', [ 'box', 'i-bem-dom', 'jquery', 'BEMHTML', 'events', 'sinon', 'chai' ],
  function(provide, Box, BEMDOM, $, BEMHTML, events, sinon, chai) {
    var expect = chai.expect;
    describe('box', function() {
        describe('vertical layout', function() {
            var box, emitter;
            beforeEach(function() {
                var
                    testLayout = { block : 'box', id : 'box',
                        // ...
                    },
                    html = BEMHTML.apply(testLayout),
                    dom = $(html).appendTo('body')
                ;
                box = BEMDOM.init(dom).bem(Box);
                emitter = box._events();
            });
            afterEach(function() {
                BEMDOM.destruct(box.domElem);
            });
            it('events', function(done) {
                this.timeout(3000);
                emitter.on('updatedOnInit', function(data){
                    console.log('updatedOnInit called');
                    // expect(true).toBe(true);
                    done();
                });
            });
        });
    });
    provide();
  }
);

В консоли вижу:

  1) box vertical layout events:
     timeout of 3000ms exceeded. Ensure the done() callback is being called in this test.

Причём, судя по всему, мой код начинает отрабатываться только после того, как тест завершает ожидание (по логам, по крайней мере, выходит так -- если они не кэшируются, конечно... Это возможно вооще?)

Что-то упустил?

+Вопрос вдогонку: как с помощью enb make specs ("enb-bem-specs": "^0.11.0") запускать не все, а отдельные тесты? Принимается что-то с командной строки?

UPD Разобрался (с помощью такой-то матери):

(1) Традиционная история с событями: подписка происходит после выкидывания события. Поменял на промисы. Сейчас всё тестируется в таком виде (фрагмент):

        it('initPromise result status should be equal updateChildSizes:done', function(done){
            box.initPromise
                .then(function(result){
                    result.status.should.be.equal('updateChildSizes:done');
                    done();
                })
                .fail(done)
            ;
        });

(2) Запуск отдельных тестов вполне логично оказался возможен с командой вида enb make specs blocks.specs/box.

(3) toBe вообще вытащил откуда-то из Jasmine. Это уже когда совсем перестал соображать, что происходит.

Темы закрываю, прошу прощения за спам.

Приветствую всех!

Помоги мне советом пожалуйста, как правильно при использовании bem-express мне использовать уровни при рендере для тач допустим?

Спасибо! Все будет bem :D

Собрали проект на project-stub, с использованием bemjson и bemhtml . Теперь пытаюсь все это прицепить это к php через bh.php . Есть ли возможность на лету портировать bemhtml шаблоны в php, чтоб в дальнейшем использовать их у себя на сайте?

Необходимо назначить модификатор блоку menu, вложенному select (нужен код на экземпляре блока, связанный с модификатором). Пробую так:

block('select').mod('nicescroll', true)(
    block('menu')(
        addMods()(function(){
            return {
                nicescroll : true,
            };
        })
    ),
    // ...

Эффект нулевой.

Как?????????????

UPD: Ага. В bem-components так:

block('select').elem('menu')(
    replace()(function() {
        // ...

Т.е., наверное, могу ловить elem('menu') как-то. Щас попробую.

UPD-UPD: Ничего не придумал, кроме:

    block('select').mod('nicescroll', true).elem('menu').replace()(function(){
        var ctx = applyNext();
        ctx = ctx.replace(/\b(class="menu)\b/, '$1 menu_nicescroll');
        return ctx;
    }),

Но ведь это же неправильно!!!

Нет возможности перехватывать определение block('select').mod('nicescroll', true).block('menu') до рендеринга?

Добрый день

Разрабатываю адаптивный сайт на флексбоксах на основе project stub

Подскажите, как лучше организовать css с медиа-запросами в структуре project stub?

Допустим у меня такая структура: http://joxi.ru/eAOY9ZWsxZYgvm

Медиа-условия писать в этом же файле или создать отдельно какой-то другой?

Добрый день!

Каскадные select'ы встречаются довольно часто в разных формах. Законченного решения мне найти не удалось, ни на форуме ни в документации. Помогите, пожалуйста разобраться на конкретном примере. Как реализовать каскадные блоки select в технологии js по следующему сценарию:

  1. Допустим, мы имеем 3 select-блока с модификатором disabled (до инициализации), например: country, city, street.

  2. После автоматической (domReady) инициализации, первый select-блок (country) выполняет обращение к API, получает данные в json-формате, заполняется пунктами, на основании полученного массива данных и в случае успеха, с первого блока снимается модификатор disabled.

  3. Выбираем пункт country, получаем значение выбранного пункта, формируем запрос к API, получаем ответ, заполняем пункты второго блока (city), снимаем модификатор disabled со второго блока.

  4. Выбираем пункт city, получаем значение выбранного пункта, формируем запрос к API, получаем ответ, заполняем пункты третьего блока (street), снимаем модификатор disabled со третьего блока.

  5. При изменении значения, для нижестоящих по иерархии (country - city - street) блоков, процедура повторяется.

Заранее спасибо!

Здравствуйте. Пытаюсь собрать блок на основе ответа от сервера через модуль http. У блока в *.bemhtml.js выполняю запрос и заполняю блок на основе ответа в callback-функции. Но сборщик не дожидается ответа и строит html дальше. Естественно блок выходит пустой. Как быть в этом случае?

var http = require('http');

var options = {
    host: 'localhost',
    path: '/TESTindex.php'
};

callback = function(response) {
    var str = '';

    //another chunk of data has been recieved, so append it to `str`
    response.on('data', function (chunk) {
        str += chunk;
    });

    //the whole response has been recieved, so we just print it out here
    response.on('end', function () {
        var items = JSON.parse(str);
        var response = [];
        for (var i = 0;i < items.length;i++) {
            item = items[i];
            response[i] = {
                title: item
            };
        }
        console.log('resp', response);
        createBlock(response);

    });
};

var createBlock = function (items) {
    console.log('1',items);
    block('testmenu').elem('content')(
        content()(function() {
            console.log('1,5');
            this.ctx.items = items;
            console.log('2',this.ctx.items);
            return this.ctx.items.map(function(item) {
             console.log('3',item);
                return {
                    elem: 'item',
                    content: [
                        {
                            elem: 'title',
                            content: item.title
                        }
                    ]
                };
             });
        })
    );
};

createBlock([
    {
        title: 'Один'
    },
    {
        title: 'Два'
    },
    {
        title: 'Три'
    }

]); // Если выполнить этот вариант, то блок строится правильно

http.request(options, callback).end(); // Если выполнить этот вариант, то в консоль выводится только '1', [....] и на этом останавливается, и блок выходит пустой.

Всем, добрый день!

На постоянную работу, требуются разработчики пользовательских интерфейсов. Требование: хорошо владеть стеком БЭМ технологий. Круг задач: автоматизация внутренних бизнес-процессов организации. Трудоустройство по ТК. В случае заинтересованности, пожалуйста, пишите на mamatkazin_ia@mgtniip.ru

Спасибо всем, кто откликнется.

Использую project-stub. Есть страница index(desktop.bundles). В ней подключаются блоки через конструкцию include:

var fs = require('fs'),
    path = require('path'),
    nodeEval = require('node-eval');

function include(filename) {
    return nodeEval(fs.readFileSync(filename, 'utf8'), filename);
}

module.exports = {
    block: 'page',
    head: [
        { elem: 'css', url: 'index.min.css' }
    ],
    scripts: [
        { elem: 'js', url: 'index.min.js' }
    ],
    content: [
        include('desktop.blocks/header/header.bemjson.js'),
    ]
};

Тем самым - это позволяет уйти от стандартного require, который кэширует содержимое. Но это не решает задачу в целом. Так как: Если изменить содержимое блока header и обновить страницу - изменения не подтянутся. Приходится вручную каждый раз делать любые изменения в самом index.bemjson.js (например добавив 1 таб), тогда блок header обновиться. Мое предположение: Сборщик считает, что файл index.bemjson.js не изменили и поэтому не пересобирает файл, а в блоках include ведь есть изменения. Возможно ли ему как то сообщить об этом, или отключить кэширование?

Добрый день Подскажите, существует ли какая-то подборка проектов сделанных по БЭМ? Учиться гораздо проще, анализируя уже грамотно написанный код у похожих с твоим проектах При изучении просто возникает масса мелких вопросов, связанных с реализацией того или иного конкретного блока, и не всегда что-то похожее я нахожу я самого Яндекса, чтобы посмотреть как там сделано

Добрый день Только начинаю изучать БЭМ и project stub Немного непонятно, как передавать в работу бэкенд разработчикам свой код? Project stub минифицирует исходный index.html, работать с ним бэкендер не сможет Как в таких случаях происходит процесс, проясните пожалуйста?

Добрый вечер В качестве основы на проекте использую project stub Подскажите как заставить собираться css файлы в подпапках проекта Скриншот - http://joxi.ru/a2XZ91nS1V5jRr

Доброго времени суток!

Наткнулся на очень странное поведение блока select с модификатором radio-check. Берем bemjson из документации:

{
    block : 'select',
    mods : { mode : 'radio-check', theme : 'islands', size : 'm' },
    name : 'select3',
    val : 2,
    text : '—',
    options : [
        { val : 1, text : 'Доклад' },
        { val : 2, text : 'Мастер-класс' },
        { val : 3, text : 'Круглый стол' }
    ]
}

несколько раз клацаем, меняем выбранное значение - все прекрасно. Но так как далеко не всегда существует значение по-умолчанию, убираем val:

{
    block : 'select',
    mods : { mode : 'radio-check', theme : 'islands', size : 'm' },
    name : 'select3',
    text : '—',
    options : [
        { val : 1, text : 'Доклад' },
        { val : 2, text : 'Мастер-класс' },
        { val : 3, text : 'Круглый стол' }
    ]
}

и повторяем манипуляции. Вот тут и начинаются странности: проклацав по-очереди все пункты получаю примерно такую разметку:

...
<div class="select select_mode_radio-check select_theme_islands select_size_m i-bem select_js_inited" data-bem="{&quot;select&quot;:{&quot;name&quot;:&quot;select3&quot;,&quot;text&quot;:&quot;—&quot;}}">
  <input type="hidden" name="select3" class="select__control" value="3">
  <input type="hidden" name="select3" class="select__control" value="2">
  <input type="hidden" name="select3" class="select__control" value="1">
  <button class="button button_size_m button_theme_islands select__button button__control i-bem button_js_inited button__control_js_inited _popup-destructor_js_inited button_checked" data-bem="{&quot;button&quot;:{}}" role="listbox" aria-owns="uniq14993408571141 uniq14993408571142 uniq14993408571143" aria-labelledby="uniq14993408571144" type="button">
    <span class="button__text i-bem button__text_js_inited" id="uniq14993408571144">Круглый стол</span>
    <span class="icon select__tick"></span>
  </button>
</div>
...

Версия bem-components 6.0.0

Здравствуйте. Есть блок с названием 'secondary-menu-bottom'. У него есть блок 'menu' с массивом 'items' и контент из одного item. Задача: Необходимо в шаблоне "смапить" массив items, до первого item-a, который уже существует в content. ApplyNext() почему то отказывается работать в связке c map. Если убрать map и оставить ApplyNext() - ошибок не будет. И аналогично с комментированием ApplyNext() - map сделает своё дело Ошибка: TypeError: Cannot read property 'map' of undefined

/ secondary-menu-bottom.bemjson.js /

module.exports = {
    block: 'secondary-menu-bottom',
    content: {
        block: 'menu',
        content: [
            {
                elem: 'item',
                content: include('desktop.blocks/more/more.bemjson.js')
            }
        ],
        items: [
            {
                url: '/',
                title: 'Все рецепты'
            },
            {
                url: '/',
                title: 'Салаты и закуски'
            }
        ]
    }
};

/ secondary-menu-bottom.bemhtml.js /

block('secondary-menu-bottom').extend()({ _inSecondaryMenuBottom: true });

block('menu').match(function() { return this._inSecondaryMenuBottom; })(
    content()(function() {
        return [
            this.ctx.items.map(function(item) {
                return {
                    elem: 'item',
                    content: { block: 'link', url: item.url, content: item.title }
                };
            }),
            applyNext()
        ]
    })
);

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

Как их разграничить правильнее, сейчас все действия выполняются на последнем слайдере если их размещено 2 и более. gallery.bemjson.js

{
  block:'show-gallery',
  js:{step:4},
  content:[
            {
              elem:'holder',
            },                                                                                                                                                                                                                                                      
            {
             elem:'dop-foto',
             content:[
                      {
                       elem:'control-next',
                       content:''
                      },
                      {
                       elem:'control-prev',
                       content:''
                      },                                                                                                                                
                      {
                       elem:'list-outer',
                       content:[
                                {
                                  elem:'list',
                                  tag:'ul',                                                                                                                                                                          
                                  content:[
                                            {                                                                                                                                          
                                              elem:'item',
                                              block:'show-gallery',
                                              js:{slideid:1, slide:1,  src:'images/show_max_2.jpg'},
                                              tag:'li',
                                              content:[
                                                       {
                                                         block:'image',
                                                         tag:'img',
                                                         url: 'images/show_mini_2.jpg',
                                                       }
                                                      ]
                                            },
                                            {                                                                                                                                          
                                              elem:'item',
                                              block:'show-gallery',
                                              js:{slideid:1, slide:2,  src:'images/show_max_1.jpg'},
                                              tag:'li',
                                              content:[
                                                       {
                                                         block:'image',
                                                         tag:'img',
                                                         url: 'images/show_mini_1.jpg',
                                                       }
                                                      ]
                                            },
                                            {                                                                                                                                          
                                              elem:'item',
                                              block:'show-gallery',
                                              js:{slideid:1, slide:3,  src:'images/show_max_3.jpg'},
                                              tag:'li',
                                              content:[
                                                       {
                                                         block:'image',
                                                         tag:'img',
                                                         url: 'images/show_mini_3.jpg',
                                                       }
                                                      ]
                                            },
                                            {                                                                                                                                          
                                              elem:'item',
                                              block:'show-gallery',
                                              js:{slideid:1, slide:1,  src:'images/show_max_4.jpg'},
                                              tag:'li',
                                              content:[
                                                       {
                                                         block:'image',
                                                         tag:'img',
                                                         url: 'images/show_mini_4.jpg',
                                                       }
                                                      ]
                                            },
                                            {                                                                                                                                          
                                              elem:'item',
                                              block:'show-gallery',
                                              js:{slideid:1, slide:1,  src:'images/show_max_5.jpg'},
                                              tag:'li',
                                              content:[
                                                       {
                                                         block:'image',
                                                         tag:'img',
                                                         url: 'images/show_mini_5.jpg',
                                                       }
                                                      ]
                                            },
                                   ]
                            }                                                                                                                                
                         ]
                      }
                   ]
},

show-gallery.js

modules.define('show-gallery', ['i-bem-dom','jquery',  'BEMHTML' ], function(provide, bemDom,$, BEMHTML) {

provide(bemDom.declBlock(this.name, {
    onSetMod: {
        'js': {
            'inited': function() {
            console.log('Слайдер инициализирован')
            var domElem = this.domElem;
                 counter = 0;
                 holderMain = this._elem('holder');
                 innerBl = this._elem('list-outer');
                 slides = this._elem('list');
                 slide = this._elem('item');
                 step = this.params.step;
                 position = 0;
                 console.log('Шаг слайдера', step);
            //Ширина блока под фотографию главную
                 this.holderMainWidth = holderMain.domElem.width(); 
                 console.log('Ширина блока под фотографию главную', this.sliderMainWidth);
            //Высота блока под главную фотографию
                 this.holderMainHeight = this.holderMainWidth / 1.54;
                 console.log('Высота блока под фотографию главную', this.sliderMainHeight);
                 holderMain.domElem.css({ height: this.holderMainHeight});
            //Ширина каждого слайда
                 this.slideWidth = slide.domElem.width(); 
                 console.log('Ширина слайда', this.slideWidth);
            //Видимая ширина слайдбара
                 slidesWidth = this.slideWidth * step;
                 console.log('Видимая ширина слайдбара', innerWidth);
                 innerBl.domElem.css({ width: slidesWidth}); 
            //Определяем ширину всех элементов
            var _this = this;
                 this._elems('item').forEach(function(elem) {
                          counter++;    
                      });
                 console.log('Число элементов', counter);
                 slidesWidthFull = this.slideWidth * counter;
                 console.log('Общая ширина слайдбара', slidesWidthFull);
                 slides.domElem.css({transform: 'translate3d(0px, 0px, 0px)', transition: '0s', width: slidesWidthFull}); 


            //Сдвигаем слайды влево
                 this._domEvents('control-prev').on('click', function(e) {
                 console.log('клик по gравому контролу');
                 position = Math.min(position + this.slideWidth * step, 0);
                 test = 'translate3d('+position+'px, 0px, 0px)';
                 console.log('Определяем на сколько сдвинуть', position);
                 slides.domElem.css({transform: test, transition: '250ms', width: slidesWidthFull});
                 }); 
            //Сдвигаем слайды вправо 
                 this._domEvents('control-next').on('click', function(e) {
                 console.log('клик по левому контролу');
                 val1 = position - this.slideWidth * step;
                 val2 = -this.slideWidth * (counter - step) 
                 position = Math.max(val1, val2);
                 test = 'translate3d('+position+'px, 0px, 0px)';
                 console.log(test);
                 slides.domElem.css({transform: test, transition: '250ms', width: slidesWidthFull});
                 }); 
            //Кликаем по слайду
                 this._domEvents('item').on('click',this._onCurSlide);
            //Определяем первый активный элемент
                 this._events('item').on({ modName : 'active', modVal : true },this._onCurSlides);
                 this._elem('item').setMod('active');





            }
        },
        },
        _onCurSlide: function(e) {
            var curSlide = e.bemTarget.params.slide;
                curSrc = e.bemTarget.params.src;
                oneId = e.bemTarget.params.id;
                console.log(curSlide);
                console.log(curSrc);
            var sliderMain =  {
                                    block: 'show-gallery-image',
                                    js:{src:curSrc},
                                    content: [
                                                {
                                                    elem:'image',
                                                    tag:'img',
                                                    attrs:{src:curSrc}
                                                },
                                                // {
                                                //     elem:'zoom',
                                                // },
                                    ]   
                                };
            html = BEMHTML.apply(sliderMain);
            console.log('формируем html', html);
            bemDom.update(holderMain.domElem, html);
    },
    _onCurSlides: function(e) {
          var oneSlide = e.bemTarget.params.slide;
              oneSrc = e.bemTarget.params.src;
              oneId = e.bemTarget.params.id;

            console.log('Номер первого слайдера', oneSlide ,oneSrc );
            var sliderMainDefault =  {
                                    block: 'show-gallery-image',
                                    js:{src:oneSrc},
                                    content: [
                                                {
                                                    elem:'image',
                                                    tag:'img',
                                                    attrs:{src:oneSrc}
                                                },
                                                // {
                                                //     elem:'zoom',
                                                // },
                                    ]   
                                };
            html = BEMHTML.apply(sliderMainDefault);
            console.log('формируем шаблон html по умолчанию', html);
            bemDom.update(holderMain.domElem, html);
    },




}));

});

Привет!

Самое время заглянуть в раздел Методология на bem.info!
Мы обновили часть старых документов и опубликовали новые:

To be continued...

Суть такова:

  • есть блок spin, у которого есть методы show и hide
  • есть родитель, который хочет управлять этим блоком Как из родительского блока получить доступ к методам spin?

Существует ли (рассматривается ли) способ организации блоков в рамках одного уровня переопреледния?

Как пример можно рассматривать ситуацию, когда имеется некоторая (предположим) сущность "Report" и все имеющие к ней отношение блоки удобно было бы хранить в одной папке. Поначалу пытался для таких ситуаций использовать отдельные уровни (создаём уровень blocks/Report, в котором храним всё, имеющее отношение к "Report"), но это получается как-то вне концепции и вообще дичь.

Т.е.: возможна ли не плоская, а древовидная структура папок для блоков внутри уровня?

Добрый день! Для вёрстки сайтов использую gulp, но сейчас появилась задача перейти на webpack. Как можно быстро настроить сборку вёрстки на webpack? Есть ли где-то актуальная инструкция на настройке для верстальщика (пока находил больше про сборку js )? Или может быть шаблон?

Использую и работаю в исходниках project-stub. Есть блок с названием advantages. У него есть элемент 'icon' с модификатором 'type'. В папке _type лежат иконки(svg) и css файлы с путями до иконок. Пример:

/* advantages__icon_type_innovation.css */
.advantages__icon_type_innovation {
    background-image: url(innovation.svg);
}

При сборке проекта и обновлении страницы, пути верные и нет ошибок. Но в иконках указан путь в формате: background-image: url(data:image/svg+xml;charset=US-ASCII......) И иконки не отображаются. Возможно ли, что не правильный способ кодирования svg и как бороться с этим? Стоит отметить, что с png всё работает.

Добрый вечер. Такой вопрос, имеется большой блок, скажем, это "block". У поста много всякого и вот есть такой элемент, как лайки и дислайки. Структура упрощенно такая

<div class="block">
.....
<div class="block__rating rating rating_type_like">
    <i class="rating__icon"></i>
    Лайк
    <span class="rating__count rating__count_type_like"></span>
</div>
<div class="block__rate rating rating_type_dislike">
    <i class="rating__icon"></i>
    Дислайк
    <span class="rating__count rating__count_type_dislike"></span>
</div>
.......
</div>

Вот такое я наваял. Как я все понимаю - block__rating - собственно показывает, что это элемент блока. Сюда же ввел новый блок - rating, чтобы от него уже получить элементы иконки рейтинга и счетчик. Изначально у меня все было элементами block, то есть block__icon и block__count, к примеру, но это даже чисто с точки зрения логики как-то неправильно. Мой вопрос, все ли верно у меня получилось по bem или где-то структурно я не прав?