EmberJS registerHelper 在 Ember 1.8 中动态呈现模板
EmberJS registerHelper to dynamically render a template in Ember 1.8
我想动态呈现模板,如下所示:
{{#each layout in layouts}}
{{render layout.get('type') layout}}
{{/each}}
问题是 render 不期望变量作为它的第一个参数,所以在旧的 EmberJS 版本中,可以通过注册一个助手来解决这个问题:
Ember.Handlebars.registerBoundHelper('render_layout',
function(callingContext, layout, options) {
return Ember.Handlebars.helpers.render.call(callingContext,
layout.get('type'), 'layout', options);
});
并在模板中:
{{#each layout in layouts}}
{{render_layout this layout}}
{{/each}}
不幸的是,这个东西在较新的 ember 版本中不起作用。
Ember.Handlebars.helpers.render.call
需要 3 个参数,但我无法正确处理它们。有任何想法吗?
我试过了:
(this, layout.get('type'), options)
并在模板中:
{{#each layout in layouts}}
{{render_layout layout}}
{{/each}}
我得到Uncaught TypeError: Cannot read property 'pushChildView' of null
...以及许多其他人。
如有任何建议,我们将不胜感激。
组件允许您指定 layoutName
。您可以根据传入组件的参数动态计算布局名称。
App.XRenderComponent = Ember.Component.extend({
tagName: "",
layoutName: function(){
return this.get('displayLayout.type');
}.property('displayLayout'),
});
那你就可以了
<script type="text/x-handlebars" id="index">
{{#each layout in model}}
{{ x-render displayLayout=layout }}
{{/each}}
</script>
查看工作示例here
我想动态呈现模板,如下所示:
{{#each layout in layouts}}
{{render layout.get('type') layout}}
{{/each}}
问题是 render 不期望变量作为它的第一个参数,所以在旧的 EmberJS 版本中,可以通过注册一个助手来解决这个问题:
Ember.Handlebars.registerBoundHelper('render_layout',
function(callingContext, layout, options) {
return Ember.Handlebars.helpers.render.call(callingContext,
layout.get('type'), 'layout', options);
});
并在模板中:
{{#each layout in layouts}}
{{render_layout this layout}}
{{/each}}
不幸的是,这个东西在较新的 ember 版本中不起作用。
Ember.Handlebars.helpers.render.call
需要 3 个参数,但我无法正确处理它们。有任何想法吗?
我试过了:
(this, layout.get('type'), options)
并在模板中:
{{#each layout in layouts}}
{{render_layout layout}}
{{/each}}
我得到Uncaught TypeError: Cannot read property 'pushChildView' of null
...以及许多其他人。
如有任何建议,我们将不胜感激。
组件允许您指定 layoutName
。您可以根据传入组件的参数动态计算布局名称。
App.XRenderComponent = Ember.Component.extend({
tagName: "",
layoutName: function(){
return this.get('displayLayout.type');
}.property('displayLayout'),
});
那你就可以了
<script type="text/x-handlebars" id="index">
{{#each layout in model}}
{{ x-render displayLayout=layout }}
{{/each}}
</script>
查看工作示例here