# Предикаты Позволяют указать условия для выбора узлов в структуре/дереве компонента. #### Предикат `block` С помощью предиката `block` можно задать условия для выбора узла(ов) с типом блок по БЭМ методологии в структуре/дереве компонента. В качестве параметров можно указать: 1. [Название блока](%D0%A5%D0%B5%D0%BB%D0%BF%D0%B5%D1%80-block_tag.md#%D0%9D%D0%B0%D0%B7%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D1%81%D1%83%D1%89%D0%BD%D0%BE%D1%81%D1%82%D0%B8) как `String` или `Symbol`, по умолчанию равно `'*'`. 1. Вторым параметром можно передать условие, которым может быть `Proc`, `lambda`, название метода или какое-либо выражение, для `Proc` и `lambda` в качестве аргумента будет передан контекст (context) узла, для которого происходит проверка условий. 1. `mods` задает список модификаторов которые должны присутствовать в списке модификаторов узла. 1. `mix` задает список миксов которые должны присутствовать в списке миксов узла. ##### Примеры Выбрать блоки с названием `panel` и заменить css классы: ```slim = render_component :panel do |template| = template.block(:panel).cls :panel, :panel_success ``` Выбрать блоки с названием `panel` и применить несколько режимов: ```slim / Эквивалентные записи = render_component :panel do |template| = template.block(:panel).cls :panel, :panel_success = template.block(:panel).bem true = template.block(:panel).js true = render_component :panel do |template| = template.block(:panel) do |panel| = panel.cls :panel, :panel_success = panel.bem true = panel.js true ``` Выбрать все блоки(с любым названием) и выключить генерацию данных связанных с БЭМ методологией: ```slim / Эквивалентные записи = render_component :panel do |template| = template.block.bem false = render_component :panel do |template| = template.block('*').bem false ``` Выбрать блоки без названия и выключить генерацию данных связанных с БЭМ методологией: ```slim = render_component :panel do |template| = template.block('').tag false ``` Выбрать все блоки которые занимают первую позицию среди своих братьев/сестер(siblings) и заменить их на строку `'Plain text'`: ```slim = render_component :panel do |template| = template.block('*', ->(node) { node.first? }).replace 'Plain text' ``` Выбрать блоки у которых есть микс `block__elem` и заменить их содержимое на строку `'Plain text'`: ```slim = render_component :panel do |template| = template.block(mix: { block: :elem }).content 'Plain text' ``` Выбрать блоки у которых есть модификатор с названием `enabled` и значением `true` и добавить `js` атрибуты: ```slim = render_component :panel do |template| = template.block(mods: :enabled).js true ``` #### Предикат `elem` С помощью предиката `elem` можно задать условия для выбора узла(ов) с типом элемент по БЭМ методологии в структуре/дереве компонента. В качестве параметров можно указать: 1. [Название элемента](%D0%A5%D0%B5%D0%BB%D0%BF%D0%B5%D1%80-elem_tag.md#%D0%9D%D0%B0%D0%B7%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D1%81%D1%83%D1%89%D0%BD%D0%BE%D1%81%D1%82%D0%B8) как `String` или `Symbol`, по умолчанию равно `'*'`. 1. Вторым параметром можно передать условие, которым может быть `Proc`, `lambda`, название метода или какое-либо выражение, для `Proc` и `lambda` в качестве аргумента будет передан контекст (context) узла, для которого происходит проверка условий. 1. `block` [название блока](%D0%A5%D0%B5%D0%BB%D0%BF%D0%B5%D1%80-block_tag.md#%D0%9D%D0%B0%D0%B7%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D1%81%D1%83%D1%89%D0%BD%D0%BE%D1%81%D1%82%D0%B8), как `String` или `Symbol`, по умолчанию равно `'*'`. 1. `mods` задает список модификаторов которые должны присутствовать в списке модификаторов узла. 1. `mix` задает список миксов которые должны присутствовать в списке миксов узла. ##### Примеры Выбрать элементы с названием `heading` и заменить их контент/содержимое: ```slim = render_component :panel do |template| = template.elem(:heading).content h3.panel-title Panel title ``` Выбрать элементы с названием `heading` и применить несколько режимов: ```slim / Эквивалентные записи = render_component :panel do |template| = template.elem(:heading).cls :css_class = template.elem(:heading).bem true = template.elem(:heading).js true = render_component :panel do |template| = template.elem(:heading) do |heading| = heading.cls :css_class = heading.bem true = heading.js true ``` Выбрать все элементы(с любым названием) и выключить генерацию данных связанных с БЭМ методологией: ```slim / Эквивалентные записи = render_component :panel do |template| = template.elem.bem false = render_component :panel do |template| = template.elem('*', block: '*').bem false ``` Выбрать элементы без названия и отключить отображение HTML тега: ```slim = render_component :panel do |template| = template.elem('').tag '' ``` Выбрать все элементы которые занимают последнюю позицию среди своих братьев/сестер(siblings) и заменить их на строку `'Plain text'`: ```slim = render_component :panel do |template| = template.elem('*', ->(node) { node.last? }).replace 'Plain text' ``` Выбрать элементы у которых есть микс `block__elem` и заменить HTML атрибуты: ```slim = render_component :panel do |template| = template.block(mix: 'block__elem' }).attrs key: :val ``` Выбрать элементы у которых есть модификатор с названием `theme` и значением `green_islands` и добавить `js` атрибуты: ```slim = render_component :panel do |template| = template.elem(mods: { theme: :green_islands }).js key: :val ``` #### Предикат `match` С помощью предиката `match` можно задать условия для выбора узла(ов) с типом блок и/или элемент по БЭМ методологии в структуре/дереве компонента. Если условия заданы для блоков и элементов, тогда необходимо использовать `&block` см. примеры. В качестве параметров можно указать: 1. Условие, которым может быть `Proc`, `lambda`, название метода или какое-либо выражение, для `Proc` и `lambda` в качестве аргумента будет передан контекст (context) узла, для которого происходит проверка условий. 1. `block` название блока, как `String` или `Symbol`, по умолчанию равно `'*'`. 1. `elem` название элемента, как `String` или `Symbol`, по умолчанию равно `'*'`. 1. `mods` задает список модификаторов которые должны присутствовать в списке модификаторов узла. 1. `mix` задает список миксов которые должны присутствовать в списке миксов узла. ##### Примеры Выбрать все блоки и элементы, и выключить генерацию данных связанных с БЭМ методологией: ```slim / Эквивалентные записи = render_component :panel do |template| = template.match do |block, elem| = block.bem false = elem.bem false = render_component :panel do |template| = template.match(block: '*', elem: '*') do |block, elem| = block.bem false = elem.bem false ``` Выбрать блоки без названия и отключить отображение HTML тега: ```slim / Эквивалентные записи = render_component :panel do |template| = template.match(block: '', elem: false).tag '' = render_component :panel do |template| = template.match(block: '', elem: nil).tag '' ``` Выбрать все элементы и отключить отображение HTML тега: ```slim / Эквивалентные записи = render_component :panel do |template| = template.match(block: false).tag '' = render_component :panel do |template| = template.match(block: nil).tag '' ``` Использование других параметров такое же как у предикатов `block` и `elem`. #### Указание дополнительных условий с помощью `specify` Метод `specify` позволяет указать дополнительные (уточнить) условия для предиката (выстроить цепочку условий), с учетом, что они еще не были объявлены до этого, есть исключения: 1. Название блока можно переопределить если оно равно `'*'` 1. Название элемента можно переопределить если оно равно `'*'` или `nil` 1. Условие которое идет вторым параметром у предикат `block` `elem` и первым параметром у `match` можно переопределять всегда 1. Параметры `mix` и `mods` можно переопределить если они еще не были объявлены ##### Примеры ```slim = render_component :panel do |template| = template.block(mix: :block) do |block| = block.specify(block: :block1).tag false = block.specify(block: :block2).tag true ```