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

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

Необходимо вызывать такое древо

<div class="filter">
    <div class="filter__item selector selector_data_city">
        <labe class="selector__label">Choise City</label>
        <select class="selector__select select select_data_city"></select>
   </div>
</div>

Собственно 3 блока filter, в элементе которого вызывается selector с модификатором _data_city, внутри которого вызывается label и select с модификатором _data_city из блока в блок, аналогично контенту, по иерархии вниз передается data

bh.match('filter', function(ctx, json) {
ctx.content([
   elem: 'item',
   mix: {
        block: 'selector',
        mods: {data: 'city'}
       data: json.data()
   },
], true);
};

bh.match('selector_data_city', function(ctx, json) {
ctx.content([
   {
       elem: 'label',
       mix: {
           block: 'label'
      },
      content: 'Choice City'
   },
   {
     elem: 'select',
     mix: {
          block: 'select',
         mods: {data: 'city'}
         data: json.data()
     },

  }
], true);
};

bh.match('select_data_city', function(ctx, json) {
   options = MakeOptions(json.data());
   ctx.tag('select');
   ctx.content([options], true);
}

Если выполнять в однои файле, то все работает. Если разнести по методогии БЭМ в разные блоки и прописать то перестает работать наследственная связь, вызвается только filter прописав deps.js блоки вызываются, но не в правильном порядке

Если в вызове блока, вместо

     elem: 'item',
     mix: {
          block: 'selector',
         mods: {data: 'city'}
          data: json.data()
     },

использовать

     block: 'selector',
     mods: {data: 'city'}
     mix: {
          block: 'filter',
          elem: 'item'
     },
     data: json.data()

То, блоки вызываются в правильном порядке, и дата передается корректно

Объясните, почему так, и как через микс вызвать блок ПОСЛЕ блока родителя

Вдруг здесь есть такие же больные по бета-версиям?

В последних EAP PHPShtorm 142.4491 (который всё равно берёт плагины от WS) поломалась инспекция в js.

Пример блока:

modules.define('form-choice-expanded', ['i-bem__dom', 'jquery'],
    function(provide, BEMDOM, $) {
        'use strict';

        /**
         * @class FormChoiceExpanded
         * @extends BEMDOM
         */
        provide(BEMDOM.decl({block: this.name}, /** @lends FormChoiceExpanded.prototype */ {
            onSetMod: {
                js: {
                    inited: function() {
                        this.bindTo('item', 'click', this._clickHandler)
                    }
                }
            },

            _clickHandler: function() {

            }
        }, /** @lends FormChoiceExpanded */ {}));
    });

Сейчас bindTo и _clickHandler внутри js.inited подсвечивается как Unresolved Variable. В предыдущих версиях IDE всё работало.

Это конечно лечится явным указанием контекста, но может можно что-то в настройках подкрутить?

         onSetMod: {
                js: {
                    /**
                     * @this FormChoiceExpanded
                     */
                    inited: function() {
                        this.bindTo('item', 'click', this._clickHandler)
                    }
                }
            },

После обновления PhantomJS с 1.9.8 до 2.0.0 перестали работать Gemini тесты. При этом сам запуск phantomjs --webdriver=4444 --disk-cache=true выдаёт тот же output что и раньше. И отдельно PhantomJS работает (проверяла на этом примере https://github.com/lvivski/phantomas) А при запуске Gemini ./node_modules/gemini/bin/gemini gather --root-url http://localhost:8000 gemini-test.js нет вообще никакого output. Как понять, что происходит?

после установки проекта через generator-bem-stub возникают проблемы с добавлением технологии bemhtml при создании блока

Всем привет.

Запускаем новый проект, все предыдущие устанавливали через generator-bem-stub в качестве сборщика использовали bem-tools, проблем не было. Сегодня пытаемся установить и встретились с проблемой такого характера:

TypeError: undefined is not a function at module.exports.require.create.name.target.methods._compileBEMXJST (E:\Server\Makeup\branch2\node_modules\enb-bemxjst\techs\bem-xjst.js:122:35) at Array. (E:\Server\Makeup\branch2\node_modules\enb-bemxjst\node_modules\vow\lib\vow.js:711:39) at Immediate.callFns as _onImmediate at processImmediate as _immediateCallback

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

Подскажите пожалуйста пример или тыкните носом в мануал правильного архитектурного взаимодействия ZF и bh.php

Проблемы с которыми столкнулись сейчас

  • передача данных в block.bh.php Не всегда можно запросить данные непосредственно из файла, если на странице вызваются несколько одинаковых блоков, например menu в которых есть функция $dataMenu = GetData('menu'); то она выполнится дважды.
  • Древо view zend обрабатывает view на страницу по своему (своя структура и свое древо) и страницы собираются через контрроллер, бэм предлагает на каждую страницу свой бандл.
  • Кеширование Проблемы с кешированием (memcache, sphinx, инстанс самого зенда)
  • Сборка одной страницы для двух пользователей Сейчас результатом работы БЭМ является html страница, которая генерируется порядка 150ms, а с кеша выдается за 30ms Если есть главная страница, в ней допустим блок "username", то для каждого пользователя нужно держать в кеше готовую страницу, а если он авторизуется, то тратить 150ms на создание новыой страницы Добавляем на страницу несколько переменных вида "фильтр товаров", "вид отображения товаров", "страница пагинации" и имеем бесчисленное множество html. Как правильно хранить кеш в таких случаях? Как быть если в html кеш попадут конфиденциальные данные?

Как канонически объеденить работу BЭМ и Zend не изобретая велосипед, или используя костыли. Есть ли примеры с кодом

Спасибо

Есть блок post, у него есть элемент <span class="post__action post__create" data-bem='{"post__create": {"url": "/post/create"} }'>Создать</span>.

На post__create навешен обработчик клика. Примерно такой:

_sendCreateRequest: function(e) {
    var $target = $(e.target),
        params = this.elemParams($target);

   $.get(params.url)
        .done(function() {});
}

И вот будет этот обработчик работать правильно или нет — зависит от порядка, в котором обявлены элементы на дом-ноде. <span class="post__action post__create"> — не работает, <span class="post__create post__action"> — работает.

И вот вопрос — это косяк в логике блока и так делать ообще не нужно никогда, или всё-таки баг в this.elemParams() и его стоит зарепортить?

Друзья, всем приветы. Пытаюсь собрать merged bundle по инструкции https://github.com/enb-bem/enb-bem-techs/blob/master/docs/build-merged-bundle.md В БЭМ новичок, поэтому тяжело пока понять что к чему. Но проект не собирается. Есть предложение включить сборку merged по дефолту в project-stub, чтобы такие коряги как я разобрались )

Вот мой make.js

var techs = { // essential fileProvider: require('enb/techs/file-provider'), fileMerge: require('enb/techs/file-merge'),

    // optimization
    borschik: require('enb-borschik/techs/borschik'),

    // css
    stylus: require('enb-stylus/techs/stylus'),

    // js
    browserJs: require('enb-diverse-js/techs/browser-js'),
    prependYm: require('enb-modules/techs/prepend-modules'),

    // bemtree
    // bemtree: require('enb-bemxjst/techs/bemtree'),

    // bemhtml
    bemhtml: require('enb-bemxjst/techs/bemhtml'),
    bemjsonToHtml: require('enb-bemxjst/techs/bemjson-to-html')
},
enbBemTechs = require('enb-bem-techs'),
path = require('path'),
fs = require('fs'),
provide = require('enb/techs/file-provider'),
platforms = ['desktop'],
levels = [
    { path: 'libs/bem-core/common.blocks', check: false },
    { path: 'libs/bem-core/desktop.blocks', check: false },
    { path: 'libs/bem-components/common.blocks', check: false },
    { path: 'libs/bem-components/desktop.blocks', check: false },
    { path: 'libs/bem-components/design/common.blocks', check: false },
    { path: 'libs/bem-components/design/desktop.blocks', check: false },
    'common.blocks',
    'desktop.blocks'
];

module.exports = function(config) { var isProd = process.env.YENV === 'production';

// Создаем директории для merged-бандлов (1)
platforms.forEach(function (platform) {
    var node = path.join(platform + '.bundles', 'merged');

    if (!fs.existsSync(node)) {
        fs.mkdirSync(node);
    }
});

config.nodes('*.bundles/*', function(nodeConfig) {
var node = path.basename(nodeConfig.getPath());

if (node !== 'merged') {
    nodeConfig.addTechs([
        // essential
        [enbBemTechs.levels, { levels: levels }],
        [techs.fileProvider, { target: '?.bemjson.js' }],
        [enbBemTechs.bemjsonToBemdecl],
        [enbBemTechs.deps],
        [enbBemTechs.files],

        // css
        [techs.stylus, {
            target: '?.css',
            autoprefixer: {
                browsers: ['ie >= 10', 'last 2 versions', 'opera 12.1', '> 2%']
            }
        }],

        // bemtree
        // [techs.bemtree, { devMode: process.env.BEMTREE_ENV === 'development' }],

        // bemhtml
        [techs.bemhtml, { devMode: process.env.BEMHTML_ENV === 'development' }],

        // html
        [techs.bemjsonToHtml],

        // client bemhtml
        [enbBemTechs.depsByTechToBemdecl, {
            target: '?.bemhtml.bemdecl.js',
            sourceTech: 'js',
            destTech: 'bemhtml'
        }],
        [enbBemTechs.deps, {
            target: '?.bemhtml.deps.js',
            bemdeclFile: '?.bemhtml.bemdecl.js'
        }],
        [enbBemTechs.files, {
            depsFile: '?.bemhtml.deps.js',
            filesTarget: '?.bemhtml.files',
            dirsTarget: '?.bemhtml.dirs'
        }],
        [techs.bemhtml, {
            target: '?.browser.bemhtml.js',
            filesTarget: '?.bemhtml.files',
            devMode: process.env.BEMHTML_ENV === 'development'
        }],

        // js
        [techs.browserJs],
        [techs.fileMerge, {
            target: '?.pre.js',
            sources: ['?.browser.bemhtml.js', '?.browser.js']
        }],
        [techs.prependYm, { source: '?.pre.js' }],

        // borschik
        [techs.borschik, { source: '?.js', target: '?.min.js', minify: isProd }],
        [techs.borschik, { source: '?.css', target: '?.min.css', tech: 'cleancss', minify: isProd }]
    ]);
}

    nodeConfig.addTargets([/* '?.bemtree.js', */ '?.html', '?.min.css', '?.min.js']);
});

config.nodes('*.bundles/merged', function(nodeConfig) {
    var dir = path.dirname(nodeConfig.getPath()),
        bundles = fs.readdirSync(dir),
        bemdeclFiles = []
    // Копируем BEMDECL-файлы в merged-бандл (3)
    bundles.forEach(function (bundle) {
        if (bundle === 'merged') return;

        var node = path.join(dir, bundle),
            target = bundle + '.bemdecl.js';

nodeConfig.addTechs([techs.provideBemdecl, {
            node: node,
            target: target
        }]);

        bemdeclFiles.push(target);
    });

    // Объединяем скопированные BEMDECL-файлы (4)
    nodeConfig.addTechs([techs.mergeBemdecl, { sources: bemdeclFiles }]);

    nodeConfig.addTechs([
        // essential
        [enbBemTechs.levels, { levels: levels }],
        [techs.fileProvider, { target: '?.bemjson.js' }],
        [enbBemTechs.bemjsonToBemdecl],
        [enbBemTechs.deps],
        [enbBemTechs.files],

        // css
        [techs.stylus, {
            target: '?.css',
            autoprefixer: {
                browsers: ['ie >= 10', 'last 2 versions', 'opera 12.1', '> 2%']
            }
        }],

        // bemtree
        // [techs.bemtree, { devMode: process.env.BEMTREE_ENV === 'development' }],

        // bemhtml
        [techs.bemhtml, { devMode: process.env.BEMHTML_ENV === 'development' }],

        // html
        // [techs.bemjsonToHtml],

        // client bemhtml
        [enbBemTechs.depsByTechToBemdecl, {
            target: '?.bemhtml.bemdecl.js',
            sourceTech: 'js',
            destTech: 'bemhtml'
        }],
        [enbBemTechs.deps, {
            target: '?.bemhtml.deps.js',
            bemdeclFile: '?.bemhtml.bemdecl.js'
        }],
        [enbBemTechs.files, {
            depsFile: '?.bemhtml.deps.js',
            filesTarget: '?.bemhtml.files',
            dirsTarget: '?.bemhtml.dirs'
        }],
        [techs.bemhtml, {
            target: '?.browser.bemhtml.js',
            filesTarget: '?.bemhtml.files',
            devMode: process.env.BEMHTML_ENV === 'development'
        }],

        // js
        [techs.browserJs],
        [techs.fileMerge, {
            target: '?.pre.js',
            sources: ['?.browser.bemhtml.js', '?.browser.js']
        }],
        [techs.prependYm, { source: '?.pre.js' }],

        // borschik
        [techs.borschik, { source: '?.js', target: '?.min.js', minify: isProd }],
        [techs.borschik, { source: '?.css', target: '?.min.css', tech: 'cleancss', minify: isProd }]
    ]);

    nodeConfig.addTargets([/* '?.bemtree.js', */ '?.html', '?.min.css', '?.min.js']);
});

};

Здравствуйте. Имеется вот такой bemjson:

({
    block: 'page-part',
    content: [{
        block: 'liquid-if',
        conditions: [{
            condition: 'blabla !=2',
            content: [{
                block: 'tatata',
                content: [{
                    block: 'liquid-if',
                    conditions: [{
                        condition: 'tata == 3',
                        content: 'Hello!'
                    }]
                }]
            }]
        }]
    }]
})

Его обрабатывает вот такой bemhtml:

block('liquid-if')(
    bem()(false),
    match(function() { return this.ctx.conditions})(
        def()(function() {
            var ctx = this.ctx.conditions,
                arr = [];
            ctx.forEach(function(item, i) {
                if (typeof(ctx[i].condition) !== 'undefined') {
                    if (i === 0) {
                        arr.push('{% if '+ ctx[i].condition +' %}')
                    } else {
                        arr.push('{% elseif '+ ctx[i].condition +' %}')
                    }
                } else {
                    arr.push('{% else %}')
                }
                arr.push(ctx[i].content)
            });
            arr.push('{% endif %}');
            return applyCtx(arr)

        })
    )
);

На выходе получаем такой html:

{% if blabla !=2 %}
<div class="tatata">
    <div></div>
</div>{% endif %}

Вопрос: из-за чего вложенный блок не применяет шаблон по моде default, хотя bem()(false) отрабатывает?

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

решил обновиться =)

1 // Fonts mixin
  2 font-url(file)
  3     return 'fonts/' + file
  4
  5 webfont(family, file, hack-chrome-windows = false, weight = 'normal')
  6     @font-face
  7     ¦   font-family family
  8     ¦   src url(font-url(file + '.eot'))
  9     ¦   src url(font-url(file + '.eot?#iefix')) format('embedded-opentype'), url(font-url(file + '.woff')) format('woff'), url(font-url(file + '.ttf')) format('truetype'), url(font-        ↪ url(file + '.svg#'+ family)) format('svg')
 10     ¦   font-weight weight
 11     ¦   font-style normal
 12 if hack-chrome-windows
 13     @media screen and (-webkit-min-device-pixel-ratio:0)
 14     ¦   @font-face
 15     ¦   ¦   font-family family
 16     ¦   ¦   src url(font-url(file + '.svg#'+ family)) format('svg')
 17
 18 webfont('font', 'font', false, 'normal')

падает с такими ошибками такое ошущение что функция webfont не отработала как надо

Error: No such file or directory: /Users/uradvd85/Documents/www/blog.bem/common.blocks/fonts/__icons/fonts/file.svg
  -> /Users/uradvd85/Documents/www/blog.bem/desktop.bundles/page_blog_search/page_blog_search.css
    at exports.Tech.base.Tech.inherit.File.exports.File.base.File.inherit.processLink [as __base] (/Users/uradvd85/Documents/www/blog.bem/node_modules/borschik/lib/techs/css-base.js:54:27)
    at exports.Tech.base.Tech.inherit.File.exports.File.base.File.inherit.processLink (/Users/uradvd85/Documents/www/blog.bem/node_modules/borschik/lib/techs/css.js:104:68)
    at null.processLink (/Users/uradvd85/Documents/www/blog.bem/node_modules/borschik/node_modules/inherit/lib/inherit.js:81:36)
    at exports.Tech.INHERIT.File.exports.File.INHERIT.process (/Users/uradvd85/Documents/www/blog.bem/node_modules/borschik/lib/tech.js:138:54)
    at exports.Tech.base.Tech.inherit.File.exports.File.base.File.inherit.processInclude (/Users/uradvd85/Documents/www/blog.bem/node_modules/borschik/lib/techs/css.js:97:61)
    at exports.Tech.INHERIT.File.exports.File.INHERIT.process (/Users/uradvd85/Documents/www/blog.bem/node_modules/borschik/lib/tech.js:138:26)
    at exports.Tech.INHERIT.process (/Users/uradvd85/Documents/www/blog.bem/node_modules/borschik/lib/tech.js:34:56)
    at Cmd.<anonymous> (/Users/uradvd85/Documents/www/blog.bem/node_modules/borschik/lib/coa.js:138:38)
    at /Users/uradvd85/Documents/www/blog.bem/node_modules/borschik/node_modules/coa/lib/cmd.js:483:22
    at _fulfilled (/Users/uradvd85/Documents/www/blog.bem/node_modules/borschik/node_modules/coa/node_modules/q/q.js:798:54)
➜  blog.bem git:(develop) ✗ /Users/uradvd85/Documents/www/blog.bem/node_modules/borschik/node_modules/coa/node_modules/q/q.js:126
                    throw e;
                          ^
Error: channel closed
    at process.target.send (child_process.js:414:26)
    at callback (/Users/uradvd85/Documents/www/blog.bem/node_modules/enb/node_modules/worker-farm/lib/child/index.js:29:17)
    at _fulfilled (/Users/uradvd85/Documents/www/blog.bem/node_modules/borschik/node_modules/coa/node_modules/q/q.js:798:54)
    at self.promiseDispatch.done (/Users/uradvd85/Documents/www/blog.bem/node_modules/borschik/node_modules/coa/node_modules/q/q.js:827:30)
    at Promise.promise.promiseDispatch (/Users/uradvd85/Documents/www/blog.bem/node_modules/borschik/node_modules/coa/node_modules/q/q.js:760:13)
    at /Users/uradvd85/Documents/www/blog.bem/node_modules/borschik/node_modules/coa/node_modules/q/q.js:574:44
    at flush (/Users/uradvd85/Documents/www/blog.bem/node_modules/borschik/node_modules/coa/node_modules/q/q.js:108:17)
    at process._tickCallback (node.js:355:11)

Можно ли получить данные, к примеру массив, который будет составлен при помощи executeJS() и использовать его в основном теле теста?

Расскажите пожалуйста, как подключить пакет для PostCSS на примере Lost (вариант, установить bem-grid не предлагать). Насколько мне известно, PostCSS уже включен в последний пакет enb-stylus.

Используется enb сборщик, и yo bem stub как стартовый пакет.

Хочу получить возможность использовать LostGrid в .styl, например:

.header {
    lost-column: 2; 
}

Всем привет!

Пытаюсь разобраться в работе модуля enb-bem-i18n на примере project-stub. Для эксперимента использую блок calendar, точнее его элемент title https://github.com/Sergei-b84/calendar

{
block: 'calendar',
mods: { theme: 'ls' },
switchers: ['', '']
 },

Очередность моих действий:

  • Установил модуль следующей командой:

    npm install --save-dev enb-bem-i18n
    
    • Изменил код шаблона calendar__title.bemhtml

c

 block('calendar').elem('title')(
content()(function(){
    var monthName = [
        'January',
        'February',
        'March',
        'April',
        'May',
        'June',
        'July',
        'August',
        'September',
        'October',
        'November',
        'December'
    ];

    var date = this._date;
    var title = monthName[date.getMonth()] + ' '  + date.getFullYear();

        return title;
    })
);

на

    block('calendar').elem('title')(
match(function () { return this.ctx.date; }).content()(function () {
    var date = new Date(this.ctx.date),
        i18n = BEM.I18N,
        month = [
        i18n('calendar__title', 'jan'),
        i18n('calendar__title', 'feb'),
        i18n('calendar__title', 'mar'),
        i18n('calendar__title', 'apr'),
        i18n('calendar__title', 'may'),
        i18n('calendar__title', 'jun'),
        i18n('calendar__title', 'jul'),
        i18n('calendar__title', 'aug'),
        i18n('calendar__title', 'sep'),
        i18n('calendar__title', 'oct'),
        i18n('calendar__title', 'nov'),
        i18n('calendar__title', 'dec')
        ];

    var title = month[date.getMonth()] + ' '  + date.getFullYear();
    return title;

     })
);

Теперь, для того чтобы все заработало, я как понимаю, мне нужно указать язык по умолчанию в каком-то конфиге и сделать какие-то изменения в .enb/make.js . Опишите, пожалуйста, подробно как это сделать на примере project-stub. ( как выглядит конфиг, куда кладем, где подключаем и какие пишем изменения в make.js) Спасибо.

Здравствуйте, сейчас изучил модуль gemini. Очень интересный и удобный, НО:

моя задача в том, чтобы сделать следующее - заходим на главную, жмем на поп-ап окно, логинимся, парсим несколько url и переходим по ним, где также делаем скрины.

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

Если есть возможность более быстрой связи (скайп, телефон и т.д.), был бы рад обменяться.

Все день добрый, опять встал вопрос как запилить генерацию спрайтов в бем проекте. Не появилось ли инструмента для создания спрайта, и подмены в конечном css стилей на нужный background-position? Попробовал заюзать gulp css-sprite, он генерит спрайт и генерит новый css с новыми стилями и именами блоков как у файлов. Менять background-position нужно в ручную, а это очень больно..

Привет! Обновил enb-bem-techs@1.0.4 до версии 2.0.0 и начались проблемы со сборкой bemhml и html. Сама сборка проходит без ошибок, но по окончании сборки я имею пустой html файл и странно собранный bemhtml. Все шаблоны в нем продублированы по 2 раза. Циклические зависимости mustDeps отсутствуют в deps файлах, т.к я использую ключ strict: true

Почему html файл пустой и почему шаблоны продублированы 2 раза?

Пример сборки бандлов:

    config.nodes(bemPages, function(nodeConfig) {
        var path = nodeConfig.getPath();
        nodeConfig.addTechs([
            [ require('enb-bem-techs/techs/levels'), { levels: getLevels(config, path) } ],
            [ techs.fileProvider, { target: '?.bemjson.js' } ],
            [ enbBemTechs.bemjsonToBemdecl ],
            [ enbBemTechs.depsOld, { strict: true } ],
            [ enbBemTechs.files ],
            //CSS
            [ techs.stylus, { target: '?.css', autoprefixer: { browsers: [ "> 2%", "last 2 versions", "Firefox ESR", "Opera 12.1", "Android >= 4", "iOS >= 5" ] } } ],
            //BEMHTML
            [ techs.bemhtml, { sourceSuffixes: [ 'bemhtml', 'bemhtml.js' ] } ],
            //HTML
            [ techs.htmlFromJSON ],
            [ techs.htmlBeautify ],
            //client JS
            [ techs.browserJs ],
            [ techs.fileMerge, { target: '?.pre.js', sources: [ '?.bemhtml.js', '?.browser.js' ] } ],
            [ techs.prependYm, { source: '?.pre.js' }]
        ]);

        nodeConfig.mode('production', function(nodeConfig){
            //CSS
            nodeConfig.addTechs([
                [ techs.stylus, { target: '_?.css', autoprefixer: { browsers: [ "> 2%", "last 2 versions", "Firefox ESR", "Opera 12.1", "Android >= 4", "iOS >= 5" ] }, compress: true } ]
            ]);
            nodeConfig.addTechs([
                //BORSCHIK
                [ techs.borschik,  { sourceTarget: '?.js', destTarget: '_?.js', freeze: true, minify: true} ]
            ]);
            nodeConfig.addTargets([ '_?.css', '_?.js' ]);
        })

        nodeConfig.addTargets([ '?.js', '?.css', '?.html', '?.browser.js', '?.beauty.html' ]);
    });

Привет! Переопределяю из bem-components:

common.blocks/control-group
├── __icon
│   └── control-group__icon.css
├── __input
│   └── control-group__input.css
└── _attached
    └── control-group_attached.css

Элементы __icon и __input (создаются через микс) актуальны, только если блок control-group содержит модификатор _attached. Возможно ли сделать так, чтобы при их использовании в *.bemjson.js модификатор применялся автоматически?

Фрагмент index.bemjson.js:

{
  block : 'control-group',
  mods: { attached: true },
  content : [
    {
      block: 'icon',
      mix: {
        block : 'control-group',
        elem : 'icon'
      },
      content: {
          tag: 'svg',
          cls: 'action_type_download',
          attrs: {
            xmlns: 'http://www.w3.org/2000/svg',
            width: 16,
            height: 16
          },
          content: '<path d="M1 13v2h14v-2h-14zm13-7h-3v-5h-6v5.031l-3-.031 6 6 6-6z"/>'
      }
    },
    {
      block : 'input',
      mods : {
        name         : 'username',
        theme        : 'islands',
        tabIndex     : 1,
        size         : 'xl',
        'has-clear'  : true,
        focused      : true,
        autocomplete : true
      },
      mix: {
        block : 'control-group',
        elem : 'input'
      },
      placeholder : 'Введите логин',
    }
  ]
}

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

В общей методолгии БЭМ и соглашения по неймингу сказано, что можно использовать модификаторы двух видов 1) ключ + значение block-name_mod-name 2) Булевый block-name_mod-name_mod-val

Однако, в документации к технологиям BemJSON или BH отсутствуют примеры установки модификатора булевого значения везде примеры установки модификаторов вида ключ-значение

{
  block: 'link',
  mods: { color: 'green' }
}

Подскажите как использовать модификаторы булевого типа

И второй вопрос.

Если у страницы указать модификатор темы

{
  block: 'page',
  mods: { theme: 'islands' }
}

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

<body class="page_theme_islands">
<div class="header page__header_theme_islands">

Еще раз здравствуйте! Заметил такую особенность у блоков select и popup (даже если у popup напрямую указать

directions : ['bottom-right'],

), при первом клике выпадающее окно смещается чуть влево. При последующих кликах такого не происходит. Даже здесь на форуме, это отчетливо видно в селекте меню "Сортировка". Это так и должно быть, или можно исправить? Не совсем красиво, особенно на темном background.

P.S. Кстати вопрос отпадает если перед вышеуказанными блоками стоят элементы с фиксированной шириной.

Привет, всем! Мне необходимо разбить текст кнопки на два независимых элемента. Например, внутри кнопки написать "2 в третьей степени", чтобы число "2" имело свои стили, а степень свои.

10 years ago

enb-stylus

В проекте используем stylus. Но возникает проблема с глобальными переменными. Хотим воспользоваться блоком page и в нём их описывать (page.styl). Однако, сделав дебаг файлов, которые попадают в технологию 'enb-stylus/techs/css-stylus', заметили, что page.styl в списке находится на последнем месте, следовательно и все переменные, которые объявленны в нём не увидит ни один блок. Подскажите, как можно поднять его в списке файлов для технологии stylus на первое место, чтобы все нижестоящие блоки (основываясь на bemjson) могли использовать его переменные? Или же какое-либо другое решение.

При переходе по ссылке без указания языка не происходит пролистывание страницы до положения якоря. Например: https://bem.info/libs/bem-core/v2.7.0/desktop/i-bem/jsdoc/#jsdoc-init-1

Не нашёл нигде документации по формату написания этого файла. Где-то пишется export.blocks, где-то export.deps. А как всё же правильно и где документация?

Спасибо.)

Всем привет. Знаю, тема заезжена, но сам никак не осилю. Пытаюсь собрать проект с enb. Для блока page в page.deps.js указываю mustDeps: { block: 'normalize' }, В файле normalize/normalize.css идёт простой инклуд css файла из libs/. И он не включаются в css файл. Что я делаю не так?

Может кто подскажет по чему?

[borschikJs, {
                    sourceTarget: '?.js',
                    destTarget: '_?.js',
                    techOptions: {
                        uglify: {
                            quote_style: 1
                        }
                    },
                    minify: true,
                    freeze: true,
                    noCache: true
                }]

Есть блок block-one, события которого слушаются в block-two через this.findBlockOn('block-one', 'block-one-elem).on('change', this._blockOneChanged, this). В bem-core изменился способ обращения к инстансу блока block-one в обработчике события.

Было:

_blockOneChanged: function(e) {
    var blockOneInstance = e.block;

    this._checkButtonsState(blockOneInstance);
},

Стало:

_blockOneChanged: function(e) {
    var blockOneInstance = e.target;

    this._checkButtonsState(blockOneInstance);
},

В руководстве по миграции есть только указание на «Доступ до DOM-элемента в обработчике события»

// cc @innabelaya

В данный момент есть проект на Java, в котором используется JSP в качестве шаблонизатора. Проект собирается ANT-ом. В production-mode после сборки JSP шаблоны нельзя редактировать. В качестве веб-сервера используется NGINX. Можно ли внедрить БЭМ в такую архитектуру и какие для этого используются инструменты?

Есть ли возможность задать переменную(класс) var для jQuery, содержащую дефисы, согласно именованию БЭМ blok-compound-name?

Если устанавливать модификаторы элементу блока из экземпляра блока по BEM-событию, то срабатывают триггеры, прописанные внутри блока в onElemSetMod, но не внутри элемента в onSetMod. Если устанавливать модификаторы элементу блока из самого экземпляра элемента по DOM-событию, то срабатывают триггеры, прописанные внутри этого элемента в onSetMod, но не внутри блока в onElemSetMod.

Есть необходимость прописать триггеры только в одном месте внутри елемента в onSetMod, но чтобы они срабатывали всегда, неважно устанавливаю ли я модификаторы через this.setMod(modName, modVal) из элемента или this.setMod(elemName, modName, modVal) из блока.

Подскажите как этого добиться и в чем может быть проблема?