我看到 ember 有一个非常好的机制,可以使用此处{{yield}}
记录的机制将内容包装在组件中。
因此,要使用文档中的示例,我可以blog-post
定义一个组件模板,如下所示:
<script type="text/x-handlebars" id="components/blog-post">
<h1>{{title}}</h1>
<div class="body">{{yield}}</div>
</script>
然后我可以blog-post
使用以下表单嵌入到任何其他模板中:
{{#blog-post title=title}}
<p class="author">by {{author}}</p>
{{body}}
{{/blog-post}}
我的问题是,我可以{{yield}}
在组件模板中指定两个不同的插座吗?
像这样的事情可以通过Named Outlets实现,Ember.Route#renderTemplate
如下所示:
车把:
<div class="toolbar">{{outlet toolbar}}</div>
<div class="sidebar">{{outlet sidebar}}</div>
JavaScript:
App.PostsRoute = Ember.Route.extend({
renderTemplate: function() {
this.render({ outlet: 'sidebar' });
}
});
我不确定我是否可以将这条路径用于不知道哪个路由的模板将呈现它的组件。
编辑1:
为了清楚起见,我尝试将 Android Swipe for Action 模式实现为 Ember 组件。
所以,我希望这个组件的用户能够指定两个不同的模板:
- 普通列表项的模板,以及
- 检测到在 (1) 上滑动时显示的操作的模板。
我想把它变成一个组件,因为很多 javascript 都在处理触摸(开始/移动/结束)事件,同时仍然管理基于平滑触摸的列表滚动。用户将提供这两个模板,该组件将管理触摸事件和必要动画的处理。
我设法让组件以块形式工作,其中块的内容被视为 (1)。第二个模板 (2) 通过一个参数 (actionPartial
下面) 指定,该参数是操作的部分模板的名称:
组件把手模板:sfa-item.handlebars
<div {{bind-attr class=":sfa-item-actions shouldRevealActions:show" }}>
{{partial actionPartial}}
</div>
<div {{bind-attr class=":sfa-item-details isDragging:dragging shouldRevealActions:moveout"}}>
{{yield}}
</div>
调用车把模板:
{{#each response in controller}}
<div class="list-group-item sf-mr-item">
{{#sfa-item actionPartial="mr-item-action"}}
<h5>{{response.name}}</h5>
{{/sfa-item}}
</div>
{{/each}}
车把mr-item-action
的定义如下:
mr-item-action.handlebars:
<div class="sf-mr-item-action">
<button class="btn btn-lg btn-primary" {{action 'sfaClickedAction'}}>Edit</button>
<button class="btn btn-lg btn-primary">Delete</button>
</div>
问题是,sfaClickedAction
上面用户提供的部分操作不会从组件中冒出来。第 4 段的文档中提到的事实。
所以,现在我不知道用户如何捕获他在提供的操作模板中定义的操作。组件无法捕获这些操作,因为它也不知道它们。
编辑 2
我在这里提出了一个后续问题