ember.js - 在 Ember 中使用多个 yield 在不同位置显示页眉、正文、页脚
问题描述
Ember中如何使用多个yield在不同位置显示页眉、正文、页脚?在下面添加了示例代码以供参考。但不工作并抛出错误说,
断言失败:找不到名为“ib.footer”的助手
组件/common/info-bar-footer.hbs:
{{yield}}
组件/common/info-bar-header.hbs:
{{yield}}
组件/common/info-bar.hbs:
<div class="info-bar" style="display: {{if isopen 'block' 'none'}}">
<div class="info-bar-header">
<button class="btn-close" data-dismiss="info-bar" {{action "handleCloseInfoBar"}}>x</button>
{{yield (hash header=(component "common/info-bar-header"))}}
</div>
<div class="info-bar-footer">
{{yield (hash footer=(component "common/info-bar-footer"))}}
</div>
</div>
模板/home.hbs:
{{#common/info-bar isopen=true as |ib|}}
{{#ib.header}}
<p class="info-content">
Hello, nice to see you again
</p>
{{/ib.header}}
{{#ib.footer}}
<button class="btn-default">Ok</button>
{{/ib.footer}}
{{/common/info-bar}}
解决方案
让我解释一下为什么会出现错误以及如何解决它。您有以下模板:
{{#common/info-bar isopen=true as |ib|}}
{{#ib.header}}
<p class="info-content">
Hello, nice to see you again
</p>
{{/ib.header}}
{{#ib.footer}}
<button class="btn-default">Ok</button>
{{/ib.footer}}
{{/common/info-bar}}
当这段代码运行时;您在两者之间提供的代码块#common/info-bar - /common/info-bar
将尝试为组件yield
内的每一部分运行common/info-bar
。所以对于第一个yield
;common/info-bar
产生以下 json 对象,您ib
在块形式使用中将其命名为:{ header:(component "common/info-bar-header") }
. 这意味着;第一个块的执行yield
具有一个ib
根本不包含任何footer
属性的对象。所以; 当您尝试使用ib.footer
;渲染页脚组件时 引发错误,表明ib.footer
未定义。
为了解决这个问题,您可以使用附加属性来yield
识别yield
. common/info-bar
让代码说话:
<div class="info-bar" style="display: {{if isopen 'block' 'none'}}">
<div class="info-bar-header">
<button class="btn-close" data-dismiss="info-bar" {{action "handleCloseInfoBar"}}>x</button>
{{yield (hash header=(component "common/info-bar-header") isHeader=true)}}
</div>
<div class="info-bar-footer">
{{yield (hash footer=(component "common/info-bar-footer") isFooter=true)}}
</div>
</div>
现在您可以在其中使用这些标记home.hbs
并执行条件检查:
{{#common/info-bar isopen=true as |ib|}}
{{#if ib.isHeader}}
{{#ib.header}}
<p class="info-content">
Hello, nice to see you again
</p>
{{/ib.header}}
{{/if}}
{{#if ib.isFooter}}
{{#ib.footer}}
<button class="btn-default">Ok</button>
{{/ib.footer}}
{{/if}}
{{/common/info-bar}}
代码块中的这些if
检查将确保:您将正确的内容放置到正确的yield
位置。我希望这可以为您澄清问题。
推荐阅读
- python - 在 manim 3b1b 库中放大图形的一部分背后的逻辑是什么?
- excel - 使用 Excel VBA 从用户输入打印多张工作表
- java - 如何将默认单选选项处理为其他单选选项
- git - Git ignoring pager settings?
- javascript - 我怎样才能得到调度的响应?
- r - 实现无引导的随机森林
- c++ - 创建一个将字符串常量返回给枚举的类的廉价方法,反之亦然?
- html - 水平对齐文本行?
- winapi - 将 UTF-16 转换为代码页并删除 unicode 文本方向控制字符?
- wordpress - 添加收藏夹以创建列表,然后通过电子邮件发送列表作为查询表单的一部分