我正在使用Handlebars帮助程序来解析一组对象,我希望将返回的结果包装在#linkTo调用中,以便Embers路由器将其解析。
以下是我在视图中调用它的方式:
{{buildBreadcrumb my_objects}}
这是我的助手的样子:
Ember.Handlebars.registerHelper 'buildBreadcrumb', (val, opts) ->
value = Ember.get(this, val)
out = ""
value.forEach (group, index) =>
if value.length - index == 2
out += '{{#linkTo group ' + group.name + '}}'
if value.length - index == 1
out += '{{#linkTo group ' + group.name + '}}'
out
由于显而易见的原因,上面只是将{{#linkTo ...}}
解析为文字字符串。有什么方法可以让我按照我想要的方式解析它吗?我很清楚我可以在视图中使用{{#each}}等...但是由于我的用例,我必须使用帮助器来构建它。有什么建议吗?
答案 0 :(得分:2)
您可以编写自定义Handlebars视图助手。该视图可以封装#each
逻辑,而最终帮助器看起来与您在此处的内容大致相似。使用的唯一区别是必须将参数作为属性传递给View帮助程序。
创建此帮助程序的方法是传入View类而不是辅助函数。
App.BreadcrumbView = Ember.View.extend({
templateName: 'breadcrumb',
penultimate: function() {
var length = this.get('items').length;
return this.get('items')[length - 2];
}.property('items'),
last: function() {
var length = this.get('items').length;
return this.get('items')[length - 1];
}.property('items')
});
Ember.Handlebars.helper('breadcrumb', App.BreadcrumbView);
和相应的模板,
<script type='text/x-handlebars' data-template-name='breadcrumb'>
<ul class="breadcrumb">
{{#each item in view.items}}
<li>{{#linkTo 'group' item}}{{item.id}}{{/linkTo}} »
</li>
{{/each}}
</ul>
</script>
并在应用程序中使用帮助程序,
<script type='text/x-handlebars' data-template-name='breadcrumb'>
<ul class="breadcrumb">
<li>{{#linkTo 'group' view.penultimate}}{{view.penultimate.id}}{{/linkTo}} »</li>
<li>{{#linkTo 'group' view.last}}{{view.last.id}}{{/linkTo}}</li>
</ul>
</script>
此方法的一个好处是绑定会自动连接,因此更改项目数据会自动更新面包屑视图,同时保留内部变形。
这是一个jsbin示例。