bem-xjst icon indicating copy to clipboard operation
bem-xjst copied to clipboard

block('*') should not apply to elems

Open miripiruni opened this issue 8 years ago • 12 comments

Examples: http://goo.gl/SBJszu

More examples: https://goo.gl/lhxXE9

miripiruni avatar Apr 28 '16 14:04 miripiruni

cc @veged @mishanga @st-lukas

miripiruni avatar Apr 28 '16 14:04 miripiruni

I think no. Current behaviour looks like a bug.

miripiruni avatar Apr 28 '16 14:04 miripiruni

In the other hand, this behaviour is quite comfortable for those who want to match to all entities (blocks and elems).

miripiruni avatar Apr 28 '16 15:04 miripiruni

Of course, not! Whenever we need to apply something to every element we can use: block('*').elem('*').

qfox avatar Apr 28 '16 16:04 qfox

Current behaviour is surprising when you expect that similar templates apply only to blocks.

St-Lukas avatar Apr 29 '16 07:04 St-Lukas

Поведение действительно странное, но его нельзя просто так оторвать, т.к. придется дублировать тело шаблона для block('*') и block('*').elem('*'). Нужен какой-то более универсальный подпредикат, под который будут попадать вообще все узлы bemjson-дерева.

mishanga avatar Apr 29 '16 08:04 mishanga

особенно это будет проблемой в https://nda.ya.ru/3RWXFK — нужно придумывать альтернативный способ

veged avatar Apr 29 '16 09:04 veged

+1 за более универсальный подпредикат, он как раз и поможет в случае с https://nda.ya.ru/3RWXFK Вот еще пример, почему так оставлять не стоит: https://goo.gl/5ILcm8 Т.е. приоритет для элемента у block('*') выше, чем у elem('*')

St-Lukas avatar Apr 29 '16 11:04 St-Lukas

TO ALL: А чем вот так плохо? https://goo.gl/ABfIlj

// Templates
var toAll = function toAll() {
    return { who: this.ctx.who };
}

block('*')(
    attrs()(toAll),

    elem('*').attrs()(toAll)
);

// BEMJSON
{
    block: 'a',
    who: 'I’m a block',
    content: {
        elem: 'b',
        who: 'I’m an element',
    }
}

miripiruni avatar May 04 '16 14:05 miripiruni

https://goo.gl/ygm5Tf

Должно ли это работать для {justASimpleObject: true}?

qfox avatar May 04 '16 14:05 qfox

@zxqfox Nope

miripiruni avatar May 04 '16 15:05 miripiruni

Если

Нужен какой-то более универсальный подпредикат, под который будут попадать вообще все узлы bemjson-дерева.

и

Должно ли это работать для {justASimpleObject: true}?

@zxqfox Nope

то:

any(block('*'), block('*').elem('*')).tag()('span') // как бы мультиплицирует

матчится на все узлы BEMJSON-дерева, но не матчится на {justAnObject: true} (вроде и не нужно) и хочет введения подпредиката any (тут вопрос), который решает задачу логического or для матчеров (либо-либо).

TO ALL: А чем вот так плохо? https://goo.gl/ABfIlj

// Templates
any(
    block('*'),
    block('*').elem('*')
)(
    attrs()(function () {
        return { who: this.ctx.who };
    })
);

Мне всё-таки кажется, что про эту «подпредикатовую» алгебру стоит как минимум подумать и взвесить минусы и плюсы. Плюсы, кажется, сильно перевешивают.

qfox avatar Aug 25 '16 00:08 qfox