Ember:基于'yield'的内容控制组件行为

2 ember.js htmlbars

想象一下,我有一个Ember组件,为了这个问题的目的只是将其内容包装在一个div,添加一些文本:

<div class="Component">
  Value is: {{yield}}
<div>
Run Code Online (Sandbox Code Playgroud)

所以我称之为

{{#component}}
  {{model.text}}
{{/component}}
Run Code Online (Sandbox Code Playgroud)

一切都很好.但是,如果model.text为empty/null/undefined,我根本不想生成该<div class="Component">部分.我怎样才能做到这一点?我当然能做到

{{#if model.text}}
  {{#component}}
    {{model.text}}
  {{/component}}
{{/if}}
Run Code Online (Sandbox Code Playgroud)

但这似乎有些重复.

我真正想做的是能够将组件定义为等效的

{{if yield}} {{! made-up syntax; of course it doesn't work }}
  <div class="Component">
    Value is: {{yield}}
  <div>
{{/if}}
Run Code Online (Sandbox Code Playgroud)

或者,也可以在component.js中

yieldNotEmpty: Ember.computed.bool('yield') // made-up syntax; doesn't work
Run Code Online (Sandbox Code Playgroud)

然后在组件的template.hbs中

{{if yieldNotEmpty}}
  <div class="Component">
    Value is: {{yield}}
  <div>
{{/if}}
Run Code Online (Sandbox Code Playgroud)

有关如何处理此案的任何想法?

nem*_*035 5

Ember 1.13.0开始,hasBlock引入了一个新的模板词.hasBlock在以块的形式调用组件时将为true.例如:

{{#if hasBlock}}
    {{! yield }}
{{else}}
    {{! regular component }}
{{/if}}
Run Code Online (Sandbox Code Playgroud)

所以对于你的例子,这将给出:

{{#if hasBlock}}
    <div class="Component">
        Value is: {{yield}}
    <div>
{{/if}}
Run Code Online (Sandbox Code Playgroud)

引入的另一个关键字是hasBlockParams,如果使用块参数调用组件(以块形式调用as |someParam|),则它将成立.