ace*_*des 16 handlebars.js ember.js htmlbars
目标是定义HTML结构,该结构具有由调用者声明的多个内容块.例如,标题,正文和内容.生成的标记应该是:
<header>My header</header>
<div class="body">My body</div>
<footer>My footer</footer>
Run Code Online (Sandbox Code Playgroud)
实例化的组件的模板将定义这三个部分,My header
,My body
,和My footer
.
使用Ruby on Rails,您将使用content_for :header
从调用者捕获标头内容并yield :header
进行插值.
这可能在ember.js中吗?
ace*_*des 18
从ember v1.10开始,yield接受参数.但是,把手还不允许对变量值进行内联比较.通过在组件上定义一些属性,我们可以非常接近rails的功能.
根据上面的示例,组件的模板如下所示:
<header>{{yield header}}</header>
<div class="body">{{yield body}}</div>
<footer>{{yield footer}}</footer>
Run Code Online (Sandbox Code Playgroud)
组件定义将解析yield语句的变量参数:
export default Ember.Component.extend({
header: {isHeader: true},
footer: {isFooter: true},
body: {isBody: true}
});
Run Code Online (Sandbox Code Playgroud)
这意味着{{yield header}}
实际上正在{isHeader: true}
向使用模板产生一个对象.所以我们可以使用嵌套的if/else结构来声明这三个部分:
{{#my-comp as |section|}}
{{#if section.isHeader}}
My header
{{else if section.isBody}}
My body
{{else if section.isFooter}}
My footer
{{/if}}
{{/my-comp}}
Run Code Online (Sandbox Code Playgroud)
之前的回复可能已经过时。
这个问题有一个公认的 RFC;在命名模板模块API将支持通过多个块同一个组件。
从 Ember 2.3 开始,上下文组件允许另一种方法来处理这种情况:
将你的组件拆分成多个子组件,并将子组件作为块参数传回组件;此设置允许设置每个子组件块的内容。
查看完整的Twiddle 示例。
// my-component.js
{{yield (hash
header = (component 'my-header')
content = (component 'my-content')
footer = (component 'my-footer')
)}}
{{#unless hasBlock}}
{{my-header}}
{{my-content}}
{{my-footer}}
{{/unless}}
// my-{header/content/footer}.js
{{#if hasBlock}}
{{yield}}
{{else}}
Default xxxxx
{{/if}}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您可以使用默认组件内容或将特定内容传递给任何子组件,例如:
{{my-component}}
{{#my-component as |f|}}
{{f.header}}
{{#f.content}}
Custom content
{{/f.content}}
{{f.footer}}
{{/my-component}}
{{#my-component as |f|}}
{{#f.header}}
Custom header
{{/f.header}}
{{#f.content}}
Custom content
{{/f.content}}
{{#f.footer}}
Custom footer
{{/f.footer}}
{{/my-component}}
Run Code Online (Sandbox Code Playgroud)
此解决方案不强制组件 API/结构,如果子组件被省略、多次添加或顺序错误,则组件可能会被错误使用,在这些情况下,组件将生成不需要的内容。
查看完整的Twiddle 示例。
归档时间: |
|
查看次数: |
5921 次 |
最近记录: |