Есть ли способ определить, пуст ли has-блок данного компонента?

#javascript #ember.js

#javascript #ember.js

Вопрос:

Я пытаюсь создать контекстный компонент, который может предоставлять заголовок по умолчанию, когда он не передается в полученном блоке. Обычно я мог бы использовать помощник has-block, чтобы определить, имеет ли компонент содержимое блока, но этот компонент всегда будет содержать содержимое блока. Я думаю, что мне нужен способ определить, имеет ли данный компонент содержимое блока. Например:

 {{! panel.hbs }}
<header>
  {{yield header=(component "blank-template")}}
  {{#if (yieldedHeaderEmpty)}}
    <h1>My Default Header</h1>
  {{/if}}
</header>
<section>
  {{yield body=(component "blank-template")}}
</section>
<footer>
  {{yield footer=(component "blank-template")}}
</footer>
 

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

  {{! panel.hbs }}
    <header>
      {{yield header=(component "my-header")}}
    </header>
...



 {{! MyHeader.hbs}}
     {{#if (has-block)}}
          {{yield}}
     {{else}}
         <h1>My Default</h1>
     {{/if}}
 

Функционально я думаю, что это сработает, но единственное назначение компонента «my-header» было бы предназначено для этого компонента «panel» и кажется расточительным. Открыт для идей. Спасибо!

Ответ №1:

Ember core недавно принял RFC для «именованных блоков», который предназначен именно для этой цели. https://github.com/emberjs/rfcs/pull/460 . С помощью этой функции мы можем называть доступные блоки и обращаться к ним с их именами, например:

template.hbs:

 <Panel>
  <:header>This is a customized header</:header>
</Panel>
 

panel.hbs:

 {{#if (has-block "header")}}
  {{yield to="header"}}
{{else}}
  <header> This is the default header </header>
{{/if}}
 

Это еще предстоит найти в ядре Ember. К счастью, у нас есть официальное заполнение, которое поддерживает эту функцию 3.12.4 : https://github.com/ember-polyfills/ember-named-blocks-polyfill