是否可以直接从模板动态呈现ember中的内容?
即,使用绑定到4个不同模板名称的4个链接:
<a href="javascript:void(0)" {{bindAttr view.view_to_render}} value="view_1">v1</a>
<a href="javascript:void(0)" {{bindAttr view.view_to_render}} value="view_2">v2</a>
<a href="javascript:void(0)" {{bindAttr view.view_to_render}} value="view_3">v3</a>
<a href="javascript:void(0)" {{bindAttr view.view_to_render}} value="view_4">v4</a>
{{render view.view_to_render generic_controller}}
还是有更有效的方法来实现这一点?
从最初的文章中,我猜您希望动态呈现实际视图,而不是部分模板。
片段
{{render view.view_to_render generic_controller}}
不起作用(根据我的经验),因为ember试图查找名为"view.view_to_render"的视图,而不是将其解释为读取视图的变量。
我使用的解决方案是有一个自定义的助手:
Ember.Handlebars.registerBoundHelper( 'renderBoundView', function ( panel ) {
var args = Array.prototype.slice.call(arguments, 1)
Array.prototype.splice.call(args, 0,0,panel.view, 'panel.model')
// Call the render helper
return Ember.Handlebars.helpers.render.apply(this, args)
})
此辅助对象从传递对象中的变量"view"中提取视图名称,然后将该名称传递给标准渲染辅助对象。然后使用
{{renderBoundView panel}}
其中面板具有带有视图名称的属性"view"和包含(解析的)模型的"model"。
当然,您也可以将传递的对象解释为从当前上下文中获取的变量名(这也是传递给助手的参数之一)。
Ember的全部目的是动态呈现内容。
如果你想渲染由数据驱动的特定"视图",在Ember中这很容易。Ember将这些局部模板称为"局部",足够恰当:)
假设您在控制器中为正在进行"常规渲染"的模板设置了一个名为partialToRender的属性。假设它绑定到一组按钮,这些按钮绑定到每个都会更改partialToRender值的操作。类似这样的东西:
<button {{action changePartialToRender 'hello'}}>Change to Hello</button>
<button {{action changePartialToRender 'goodbye'}}>Change to Goodbye</button>
<button {{action changePartialToRender 'yes'}}>Change to Yes</button>
<button {{action changePartialToRender 'no'}}>Change to No</button>
然后在你的控制器中,你会有这样的动作:
App.IndexController = Em.ObjectController.extend({
partialToRender: null,
actions: [
changePartialToRender: function(newValue) {
this.set('partialToRender', newValue);
}
]
});
这意味着,每当用户单击某个按钮时,partialToRender的值都会发生变化。甜蜜,对吧?:)
因此,现在我们所需要做的就是连接我们的部分模板代码。分部模板只是另一个模板,但它是页面的一部分,而不是完整的。。。在每种情况下都有一些不同的内容,以呈现到我们的初始模板中。。。
因此,我们重新访问如下模板:
<button {{action changePartialToRender 'hello'}}>Change to Hello</button>
<button {{action changePartialToRender 'goodbye'}}>Change to Goodbye</button>
<button {{action changePartialToRender 'yes'}}>Change to Yes</button>
<button {{action changePartialToRender 'no'}}>Change to No</button>
{{#if partialToRender}}
{{partial partialToRender}}
{{/if}}
注意,我只是将分部封装在if语句中,以确保在未设置的情况下不会进行渲染。
另外请注意,我没有在这里为您指定部分。我只是在刺激你的食欲。如果你真的对此感兴趣,我建议你在余烬网站的入门指南上观看余烬视频。这有点杂乱无章,但它展示了Ember的一些强大功能,或者可能会浏览Ember主网站上的指南/教程。
希望能回答您的问题:)