Repo to host Russian language content for BEM Forum
bem-site / bem-forum-content-ru Goto Github PK
View Code? Open in Web Editor NEWContent BEM forum for Russian speak users
License: MIT License
Content BEM forum for Russian speak users
License: MIT License
Repo to host Russian language content for BEM Forum
Подскажите как использовать php-скрипты при сборке страницы? Я только начал вникать в БЭМ и не въезжаю где писать серверную часть на php. В bemhtml описываю шаблон, в bemjson структуру блоков... где писать php-скрипты?
Решил предложить в качестве идеи на подумать такой вариант - https://yadi.sk/i/HLM1KIHIYexBG
Заголовок - над подписью, подпись меньше и убрать решетку с номером непонятно чего ;)
Подскажите как создать блок BEM (в идеале из BEMJSON) в runtime, например по событию нажатия на кнопку, и добавить его в к содержимому другого блока.
Привет! Подскажите есть в природе enb или bem-tools технологии для работы с графикой(jpg/png/svg). Например блок с фоновой картинкой(картинка лежит гдето в папке блока)
Покажите пожалуйста примеры такого использования
Возможно я это упустил из док. Ткните мне как правильно в browser.js делается поиск блоков рядом? Или как это делаете вы?
Сейчас я делаю что-то типа:
this._bla = this.findBlockOutside('category').findBlockInside('control-group');
Кажется, я упустила что-то из документации по bemhtml. Хочу ответы на следующие простые вопросы:
Предлагаю собрать случаи определения зависимостей, которые не удалось выразить в текущей схеме сборки, в текущих deps.js
.
Предлагается написать блок для реализации сетки. Блок должен учитывать сетку из проектов Яндекса в новом дизайне, использующих bem-components. Я предлагаю взять для начала сетку реализованную мной тут. Это фактически порезанный порт сетки из Foundation. А затем следующей версией внедрить поддержку flexbox, чтобы можно было поддерживать старые браузеры. @tadatuta предлагал писать сразу, используя flexbox, а старые ie поддерживать отедльным css. Все заинтересованные лица приглашаются к обсуждению.
Интересна реализация похожая на реализацию подключания jquery.
Сам пробовал сделать на подобии, но ничего не вышло. Прошу помощи
До сих пор не могу понять магию apply, applyNext, applyCtx хотя ни раз читал ман по ним
Вообще мне нужно изменить элемент на ссылку, если в параметрах есть url, я сделал так
block('nav').elem('item') ( match(this.ctx.url) ( function() { this.ctx.block = 'link'; delete this.ctx.elem; this.ctx.mix = [ { block: this.block, elem: 'item' } ]; applyCtx(this.ctx); } ) );
Получаю бесконечную рекурсию - [RangeError: Maximum call stack size exceeded]
Сейчас я поставил такой костыль:
block('nav').elem('item') ( match(this.ctx.url && !this.ctx._prepared) ( function() { this.ctx.block = 'link'; this.ctx._prepared = true; delete this.ctx.elem; this.ctx.mix = [ { block: this.block, elem: 'item' } ]; applyCtx(this.ctx); } ) );
Как сделать правильно?
Please kick me!
/* global modules:false */
modules.define('singleton', ['inherit'], function (provide, inherit, Singleton) {
/**
* @abstract
* @class Singleton
*/
Singleton = inherit( /** @lends Singleton.prototype */ {
/**
* Must be implemented by subclass
* @constructor
* @private
*/
__constructor: function () {}
}, /** @lends Singleton */ {
/**
* Instance stores a reference to the Singleton
* @private
*/
_instances: [],
/**
* Get the Singleton instance if one exists or create one if it doesn't
* @param c
* @returns {*}
*/
getInstance: function (c) {
if (!this._instances[c]) {
this._instances[c] = new c;
}
return this._instances[c];
}
});
provide(Singleton);
});
/* global modules:false */
modules.define('my-singleton', ['inherit', 'singleton'], function (provide, inherit, Singleton, MySingleton) {
/** @class MySingleton */
MySingleton = inherit(Singleton, /** @lends MySingleton.prototype */ {
/**
* @constructor
* @private
*/
__constructor: function () {
this._property = null;
},
setProperty: function (property) {
this._property = property;
},
getProperty: function () {
return this._property;
}
}, /** @lends MySingleton */ {
getInstance: function () {
return this.__base(this);
}
});
provide(MySingleton);
});
modules.require(['my-singleton'], function (mySingleton) {
var singleA = mySingleton.getInstance();
var singleB = mySingleton.getInstance();
alert(singleA === singleB)
});
Пока наш форум далек от идеала, но мы работаем над этим. И в этом процессе без вас не обойтись!
Поэтому, если вы заметили, что что-то не работает или работает не так, и
как вам бы того хотелось, пишите про это пост прямо в форум с меткой bem-forum.
В общем, не забавы ради, а ради упрощения старта проекта на express, набросал библиотечку, которая умеет подключать движки для ваших вьюх, и асинхронные мидлвари, через которые, например, реализован плагин сборки проекта для работы.
https://github.com/zxqfox/express-bem
И 3 плагина — .bemhtml.js
, .bemtree.js
, и собственно make
через bem-tools
.
Технически, наверное, .bemhtml.js
может подключать и .bh.js
, для этого нужно только подменить расширение, но протестировать не на чем.
Проект сыроват, хочется критики и идей. Если найдутся смельчаки и протестируют проект на enb
— будет здорово. А если еще и соберут мидлварь для него — вообще замечательно.
Спасибо за внимание ;-)
Здесь собираем варианты API TechBuilder, выбираем наиболее подходящий.
Analyze — пакет, который строит объектную структуру проекта.
Первая цель — генерация UML-диаграмма классов и взаимодействий, которая бы не протухала.
Анализ структуры проекта и связей между ними.
Работает на провайдерах.
Подходит для BEViS-проектов, но сама структура не слишком завязана на BEViS, т.к. используются достаточно абстрактные сущности.
Но провайдер jsdoc работает на BT-шаблонах.
Есть провайдер для модульной системы, написанной dfilatov.
Есть дополнения.
CLI
Единственная команда report — загружает конфиг .analyze.js (если есть), вынимает оттуда директории проекта, анализиует проект (все файлы с расширением js, но не test.js). Каждый файл обрабатывается отдельно.
Каждый провайдер возвращает данные, на основе которых формируется общий результат.
Пост-обработка — построение зависимостей (между классами).
Набор зависимостей — это отдельная сущность.
Обработка:
На данном эта получаем
Объектная модель (инстанс Project)
и инстанс ErrorLog (включает указание на строку с ошибкой)
Настройка
node.js-модуль экспортирует функцию, которая настраивается конфигуратором.
Планы на будущее
Команда репорт не будет иметь предустановленных стратегий анализа (стратегии будут описываться отдельно).
Будет возможность в js-файле описывать стратегии.
Хочется:
builder (сделать настраиваемый, который бы можно было переопределять)
стратегии (какой проект)
вызывает процессоры про каждую сущность
file-analyzer -> js-file-analyzer
BT-json -> MD + вставки ```BT-json, примеры и документация по js из jsdoc.
BEViS-doc-builder включает две технологии для генерации одно- и многостраничной (для Dash) документации.
Есть предложение, что нужно делать tool-chain из модулей с API, решающих конкретные задачи. И в этом контексте есть идея, что можно вынести из ENB ядро (task + node + target), для решения задачи сборки без привязки к предметной области.
У Марата нет уверенности, что устройство на node&target — это хорошо, т.к. понятие ноды излишне конкретное.
Для сборщика общего назначения есть смысл оставить только target-ы (таски).
node - это папка (частный случай task)
target - файлы либо папки, которые лежат в node
task - как в Гранте, но без параметров (именованная задача, которая может использовать другие task).
Есть ли способ исключить блок из сборки? Например, есть блок A на уровне проекта и на уровне библиотеки. Хотелось бы, чтобы в сборку попала только реализация из проекта.
Эксперименты с noDeps
к желаемому результату не привели. Может быть, я не умею его готовить?
Пока @veged не закрыл песочницу, скажите, как лучше подключать плагины?
Вариант нумер 1 с ручным переопределением, доопределением некоего объекта BEM.
Плагин выглядит так:
module.exports = function (BEM) {
// пишем команду
BEM.command.cmd()
.opt()....end()
.act(function () { ... });
// работаем с внуренностями
BEM.levelManager.get('somelevel').doSomething();
BEM.techManager.get('uberstrings').makeMeHappy();
// добавляем какой-то метод и объект
BEM.mySpecialMethod = function ... ;
BEM.superContainer = { ... };
};
Вариант нумер 2 с предоставлением интерфейса с ym. В этом случае можно даже зафризить объект, чтобы не было желания работать через "глобальный" объект BEM. Т.е. некий jail.
module.exports = function (BEM) {
// отдаем объект coa, который подкоманда abc
BEM.defineCmd('abc')
// тут лучше оставить как есть, решение хорошее
.opt()...end().act(...);
// внутренности закрываем
BEM.requireLevel(['somelevel'], function (somelevel) {
somelevel.doSomething();
});
BEM.requireTech(['uberstrings'], function (uberstrings) {
uberstrings.makeMeHappy();
});
// добавляем какой-то метод
BEM.define('bem', function (provide, bem) {
bem.mySpecialMethod = ...;
bem.superContainer = { ... };
provide(bem);
});
};
Вариант нумер 3. Как 2, но через "промисы":
module.exports = function (BEM) {
BEM.defineCmd...
// fail навешиваем в BEM.requireLevel, если он не найдется.
BEM.requireLevel('somelevel').thenCall('doSomething');
BEM.requireTech('uberstrings').then(function (uberstrings) {
uberstrings.makeMeBoring();
});
BEM // или просто define
.defineProperty('mySpecialMethod', function ...)
.defineProperty('...');
});
"Зачем нам этот огород?" — спросите вы. Все просто.
Менеджер уровней и уровни, которые есть в bt1.0, предлагается спрятать в пакете bem-levels, допилить, и подключать как-то так:
module.exports = function (BEM) {
require(level), require(levels), ...
var levelManager = new ...
BEM.define('levels', function () {
});
BEM.on('ready', function () {
levelManager.cd( BEM.require('config').cwd() );
});
}
Аналогичным образом, еще до bem-levels
, подключится bem-config
, и скажет, что он определяет config
. За ними bem-deps
, bem-make
, build
, decl
, etc.
Все эти команды должны иметь 1 понятный интерфейс, чтобы работать с бэм-предметной областью, а не js-объектами, методами, магией.
p.s. Мне кажется, тут всем нравится api
у coa
. Можно выкинуть пачку методов для каждого define*
, примерно как в 3.
Фактически, через плагины нужно будет работать с уровнями, технологиями, командами. Последние две можно описать тасками (или, как минимум, наследоваться от него). Таким образом, получится команда — coa
, технология и уровень — какое-то api. Похожим образом сделано в enb
: defineНечто(...).настройка1(...).настройка2(...).etc()
.
p.p.s. Призываю к голосованию потенциальных авторов команд, технологий, и других плюшек. Каждый голос важен!
Наш постоянный фронтендер собрался в отпуск, а проект, кровь из носу, надо пилить.
Необходимо разработать фронтенд для многошаговой регистрации с заполнением большого количества полей профиля.
На вход будут предоставлен аккуратный psd-макет, консультации дизайнера и проджект-менеджера. На выходе мы ждем фронтенд, который будет сделан максимально приближенно к тому, что мы обычно делаем: БЭМ, LESS, jQuery, немного Knockout. Причем аккуратно, с любовью.
bem-tools 2.0 — это модульная штука, где ядро — это небольшая программа, использующая COA и для которой можно писать библиотеки.
Все, что относится к командам и АПИ реализуется в виде АПИ.
Уже сейчас с командами сделано, так, что команды можно расширять. Это сделано за счет COA.
Текущее АПИ нужно выносить в отдельные модули.
Все команды реализуются в виде отдельных пакетов с экспортируемой функцией, которая на вход получает определенный контекст.
Но как писать эти команды? Копипастить код из текущих bem-tools плохо, т.к. будет много копипаста. Так что нужно вынести куда-то общебэмовую функциональность:
Служебное низкоуровневое API (bem-util):
Build берет на вход декларацию (список) и технологию, а на выходе получается как правильно одна сущность — reduce (получает размеченный список сущности, у которых уже есть технология).
translate — это часть bem create, которая из одного файла технологии получает файл в новой технологии.
В bem-tools 2.0 хочется писать технологии не для команд bem create/ bem build, а технологии для сборки. Они будут работать по-разному в зависимости от необходимой собираемой технологии и вызывать внутри себя bem reduce, bem translate, etc.
bem-sets — это форк bem-pr, который отличается по интрефейсу, т.к. служебные библиотеки нужно подключать как npm-модули. Теперь bem-sets расширяются для сборки документации.
bem map — на входе несколько уровней и декларацию, а на выходе не одна сущность, а пачка значений. Пришедший набор в декларации возвращается таким же набором, но как-то трансформированным. Нарпимер, был были common.blocks + desktop.blocks и в результате examples собираются смерженными по специальным правилам.
taffyDB (?)
Пакет bem-tools по зависимостям тянет стандартные модули.
bem make будет отдельным пакетом.
Есть два блока которые должны ловить события третьего блока:
Блок который по какой-то причине не ловит события
BEM.DOM.decl('events', {
onSetMod: {
'js': function ()
{
this._invisible();
BEM.DOM.blocks['chek-type-redaktor'].on('change_area', this._invisible, this);
BEM.DOM.blocks['chek-type-redaktor'].on('change_events', this._visible, this);
}
},
_visible: function ()
{
this.setMod("hidden", "false");
},
_invisible: function ()
{
this.setMod("hidden", "true");
}
}, {
live: false
})
Блок который прекрасно ловит события
BEM.DOM.decl('area', {
onSetMod: {
'js': function ()
{
BEM.DOM.blocks['chek-type-redaktor'].on('сhange_area', this._visible, this);
BEM.DOM.blocks['chek-type-redaktor'].on('сhange_events', this._invisible, this);
}
},
_visible: function ()
{
this.setMod("hidden", "false");
},
_invisible: function ()
{
this.setMod("hidden", "true");
}
}, {
live: false
})
Блок который генерирует БЕМ события
BEM.DOM.decl('chek-type-redaktor', {
onSetMod: {
'js': {
'inited': function ()
{
console.log("chek-type-redaktor active");
}
}
},
onChange_area: function ()
{
this.trigger('сhange_area');
},
onChange_events: function ()
{
this.trigger('сhange_events');
}
}, {
live: function ()
{
this.liveBindTo("change-area", 'click', function (e)
{
this.onChange_area(e);
});
this.liveBindTo("change-events", 'click', function (e)
{
this.onChange_events(e);
});
return false;
}
});
Блоки в bemjson
{
block: 'area',
js: true
},
{
block: 'events',
js: true
}
В чем причина того то блок events не ловит события блока chek-type-redaktor, а блок area прекрасно ловит?
Где можно почитать?
В продолжение https://github.com/bem/bem-core/pull/622/files
@tadatuta: сборка бандла технологии инвалидируется по суффиксам, от которых она зависит.
@tadatuta: в данном случае есть «обычная» зависимость от js и browser.js — изменение блоков в этих технологиях инвалидирует сборку бандла. плюс по depsByTech есть зависимость от bemhtml. и изменение блоков в технологии bemhtml сейчас пересборку не вызывает, поэтому приходится передавать force явно.
@zxqfox: очень часто слова хак и depsByTech встречаются рядом.
@tadatuta: так и есть. полноценную реализацию, которую начали делать в рамках bem-tools@v1 так и не довели до конца :(
@veged: дело не столько в depsByTech сколько в сшивании двух технологий в один файл и инвалидации кешей
@zxqfox: Честно говоря, проблема здесь не в бэме или технологиях, а в его конкретной реализации/оптимизациях.
@zxqfox: Насколько я помню, там сейчас есть небезбажный монолит APW. Это он о протухшем кеше не знает?
@veged: APW это абстрактная очень штука, она сама по себе ни о чём таком не может ни знать ни не знать — но да, это уже оффтопик
Хочется понять, что надо сделать, чтобы этой проблемы не было.
На мой взгляд вариантов два:
У кого-то еще есть желание что-то с этим сделать?
Всем привет! Когда запускаю генератор, то на вопросе "Use design from bem-components? YES" вылетает такая ошибка http://floomby.ru/s2/hW686z
Что это значит? Вроде пишет что нет какого-то модуля, вообщем не могу разобраться..
Как к примеры вы разделяете блоки самого сайта и админки для сайта написанных на БЭМ, сейчас у меня это 2 разных проекта (основанных на project-stub, тоесть это 2 копии project-stub для публичной части и админки), думаю как их можно соеденить
Я создаю несколько страниц командой
bem create -l desktop.bundles -b about
bem create -l desktop.bundles -b map
После выполнения bem make я получаю соответствующие css и js для каждой страницы, а как получить общий css и js для подключения на сайте?
И второй вопрос, на сколько я понял команда bem make не "минифицирует" js и css файлы?
P.S. за время написания данного текста, курсор раз 20 убегал в поле поиска, не удобно.
Если есть у кого, прошу ссылочку. Хочется видеть сборку простого проекта с bemtree
Входящие: Есть редктор, который сохраняет примерно такие данные
post.html = '<p>\r\n\t\tСтремление к совершенству – пожалуй, именно так можно описать развитие человечества. Вот взять, к примеру, женскую красоту. Чего только не сделают девушки, чтобы оказаться самой красивой. ... .</p>\r\n\t<!-- gallery(3) --><p>\r\n\tА вот раньше оверклокинг существовал исключительно ради выгоды. ... </p><p><!-- gallery(4) --></p>'
В этой строке есть вставки коментариев.
Задача: В контексте bemtree хочу заменить комнтарии на html код блока галлереи с слайдером. Хоче сделать примерно следующее:
post.galleries.map(function(gallery, index) {
var id = post.galleries_list[index].id,
images = post.galleries[index].images,
galleryBlock = {
block : 'slider',
slides : images
}; //Здесь что-то нужно сделать что бы распарсить блок в строку
post.html = post.html.replace('<!-- gallery(' + id +') -->', galleryBlock)
})
Вопрос: Как в bemtree/bemhtml распарсить блок в html строку?
Или предложите другие варианты решения проблемы?
До сих пор не могу понять магию apply
, applyNext
, applyCtx
хотя ни раз читал ман по ним
Вообще мне нужно изменить элемент на ссылку, если в параметрах есть url, я сделал так
block('nav').elem('item')
(
match(this.ctx.url)
(
function()
{
this.ctx.block = 'link';
delete this.ctx.elem;
this.ctx.mix = [
{
block: this.block,
elem: 'item'
}
];
applyCtx(this.ctx);
}
)
);
Получаю бесконечную рекурсию - [RangeError: Maximum call stack size exceeded]
Сейчас я поставил такой костыль:
block('nav').elem('item')
(
match(this.ctx.url && !this.ctx._prepared)
(
function()
{
this.ctx.block = 'link';
this.ctx._prepared = true;
delete this.ctx.elem;
this.ctx.mix = [
{
block: this.block,
elem: 'item'
}
];
applyCtx(this.ctx);
}
)
);
Как сделать правильно?
Что делаю не правильно?
modules.define('navigation', ['i-bem__dom'], function (provide, BEMDOM)
{
provide(BEMDOM.decl({block: this.name}, {
onSetMod: {
'js': function ()
{
console.log("navigation активен")
}
}
}, {
live: function ()
{
this
.liveBindTo('click', function ()
{
var wrapper = this.findBlockOutside({ blockName : 'wrapper'});
if (this.hasMod("open")) {
this.delMod("open");
wrapper.delMod("compress");
} else {
this.setMod("open", "true");
wrapper.setMod("compress", "true");
}
});
}
}));
});
modules.define('wrapper', ['i-bem__dom'], function (provide, BEMDOM)
{
provide(BEMDOM.decl({block: this.name}, {
onSetMod: {
'js': function ()
{
console.log("wrapper активен")
}
}
}, {
live: false
}));
});
this.findBlockOutside({blockName: 'wrapper'})
возвращает null
Привет! А есть/будет у форума RSS-лента? Есть вообще какой-нибудь roadmap?
Столкнулся с этой ошибкой когда решил положить блоки и бандлы в папку src/ на проекте и настроить сборку так.
/
.bem/
src/
desktop.blocks
desktop.bundles
в make.js
соответственно указал
getBundlesLevels: function() {
return [
'src/desktop.bundles'
];
}
Сборка происходит нормально, но в такой схеме сервер падает на этом then
BEMTREE.apply(json)
.then(function(bemjson) {
res.send(BEMHTML.apply(bemjson));
});
А если положить эти же папки, блоков и бандлов, в корень то все отрабатывает как надо.
Подскажике как поправить и настроить предложенную выше схему.
Весь кусок про сервер и шаблонизацию
var bemtreeTemplate = FS.readFileSync( './src/desktop.bundles/index/_index.bemtree.js'),
bemtmlTemplate = FS.readFileSync( './src/desktop.bundles/index/_index.bemhtml.js');
var context = VM.createContext({
Vow: vow,
console: console,
borschik: {
link: function(i) {
return i;
}
}
});
VM.runInContext(bemtreeTemplate, context);
BEMTREE = context.BEMTREE;
VM.runInContext(bemtmlTemplate, context);
BEMHTML = context.BEMHTML;
BEMTREE.apply(json)
.then(function(bemjson) {
res.send(BEMHTML.apply(bemjson));
});
bem-deps
bem-deps
DepsContainer
Контейнер для инкрементального накопления зависимостей.
Методы инстанса:
add(deps)
— добавляет информацию о зависимостях в контейнер; deps
— чанк, описывающий зависимости в унифицированном форматеserialize()
— сериализует информацию в унифицированный форматforEach()
— хелпер, позволяющий получить необходимое подмножество из объектной модели зависимостейСтатические методы:
deserialize()
— фабрика, создаёт инстанс DepsContainer
из сериализованного форматаTBD
{
deps: [
{
block: 'block-name', // имя блока
elem: 'elem-name', // имя элемента
mod: 'val' || true // имя и значение модификатора, `true` в качестве значения для булева модификатора
priority: true // флаг приоритета зависимости
}
],
priority: [] // массив для указания приоритета зависимостей без их включения
}
Абстрактный класс, задаёт интерфейс для парсеров зависимостей.
Парсер исходных файлов deps.js
.
Парсер исходных файлов deps.yaml
.
Парсер исходных js
файлов, использующих модульную систему ym
. Полезен при условии, что имена модулей однозначно соответствуют описываемых в них БЭМ-сущностям.
Утилиты возвращают новый инстанс DepsContainer
с вычисленными зависимостями:
subtract(source, subtraction...)
merge(source...)
intersect(source...)
Когда в первый раз заходишь на форум, еще не авторизован через GitHub. Начинаешь просматривать посты, проматываешь страницу вниз. При этом желтая кнопка авторизации уползает за пределы видимости. Если ты ее сразу не заметил и не авторизовался, ответить на пост невозможно. Там просто нет кнопки ответа, а то что это из-за отсуствия авторизации — не очевидно. Думаю, надо для неавторизованных делать кнопку "авторизоваться и ответить"
Неправославный вопрос: кто-то пробовал разрабатывать, используя бем и Enb,
под виндой? Работает ли? Какие могут возникнуть подводные камни?
Решил я попробовать обернуть сторонний виджет в блок БЭМ, возьмем например Yandex Share
<script type="text/javascript" src="//yandex.st/share/share.js"
charset="utf-8"></script>
<div class="yashare-auto-init" data-yashareL10n="ru"
data-yashareQuickServices="vkontakte,facebook" data-yashareTheme="counter"></div>
Я создаю блок bem create -l desktop.blocks -b yashare
с содержимым
# desktop.blocks/yashare/yashare.bemhtml
`block('yashare')(
tag()('div'),
bem()(false),
cls()('yashare-auto-init'),
attrs()({'data-yashareQuickServices': '...', 'data-yashareTheme': '...')
)
/* desktop.blocks/yashare/yashare.browser.js */
modules.define('yashare', ['loader_type_js'], function(provide, loader) {
loader('//yandex.st/share/share.js', provide);
});
А теперь вопрос, как воспользоваться данным блоком, чтоб подключения share.js было единожды (это уже реализует loader), но только в случае наличия на странице блоков yashare?
Если в yashare.browser.js добавить modules.require(['yashare'], function() {}); то подключение скрипта будет вне зависимости от наличия на странице блоков.
В качестве виджета может быть и другой, главная задумка, что скрипт подключается единожды независимо от количества блоков (виджетов) на одной странице.
P.S. Из-за плохой, не структурированной, а местами просто устаревшей документации - очень высокий порог вхождения...
Ожидаемое поведение - открытие формы добавки поста с чекнутым bem-forum
А кто-то использует subj?
Поделитесь как это использовать?
block('content')
(
tag()('article'),
elemMatch()
(
tag()(this.ctx.elem)
)
);
Никак не пойму, почему не отрабатывает этот шаблон, а конкретно не подхватывает tag()('article')
, если убрать из шаблона elemMatch()
то тэг проставляется
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.