我想实现以下概念。你能给我一些我应该看看的提示或关键字吗?
这些是我的要求:
- 我想渲染一个元素列表。
- 每个元素都应该包含一个按钮。单击按钮应显示与单击的元素相关的其他详细信息(我不想使用 jquery 进行简单的隐藏和显示,因为此单击会触发对我的后端服务器的额外调用)。
我的猜测是它可以像这样工作:
- 实现一个 ArrayController 来控制元素列表。
- ArrayController 应该再次为每个元素包含一个控制器。
- 单击元素时,元素视图的出口应连接到控制器以获取更多详细信息。
这些是我对这种方法的问题:
- 这是一个可行的方法吗?
- 如何实例化多个控制器并在模板中将元素传递给它?
- 如何访问元素的控制器,以便我可以为详细视图连接适当的控制器?
抱歉,我无法在描述中包含更多 Ember 术语。我刚刚完成了第一个教程,现在我需要有人给我正确的方向。谢谢!:-)
- - -更新 - - -
我在周末自己解决了这个问题,并提出了以下解决方案。 http://jsfiddle.net/mavilein/SNte7/4/
我认为 pangratz 提出的解决方案(第一个答案)很好,如果一个人有一个像他使用过的那样简单的模型。当我看到他的回答时,我意识到我没有足够详细地描述我的要求。其实我的要求是这样的:
列表的初始状态
- 第一个元素
- 第二元素
- 第三要素
单击例如项目 3 后,它应该显示它的关联项目:
- 第一个元素
- 第二元素
- 第三要素
- 第三个元素的关联项目 1
- 第三个元素的关联项目 2
因此,我希望有一个单独的控制器来控制列表中我的元素的关联项目。在我看来,网点是正确的选择。
实际上,我必须修补 ember 框架以实现所需的行为。目前我将此功能称为“动态插座名称”。目前可以在 HandleBars 模板中指定插座名称,但不能使用对象的属性动态生成这些名称。我修补了插座助手以评估 String 参数是否表示对象的属性:
Ember.Handlebars.registerHelper('outlet', function(property, options) {
if(arguments.length === 3){
var optionsTemp = arguments[arguments.length - 1],
context = arguments[0];
var temp = Ember.Handlebars.get(this, context, optionsTemp);
if(temp)
property = temp;
options = optionsTemp;
}else if (property && property.data && property.data.isRenderData) {
options = property;
property = 'view';
}
options.hash.currentViewBinding = "controller." + property;
return Ember.Handlebars.helpers.view.call(this, Ember.ContainerView, options);
});
这样我就可以使用对象属性作为插座名称的值。
<script type="text/x-handlebars" data-template-name="items" >
{{#each item in controller}}
{{item.description}}
<button {{action showAssociatedItems item}}>Show Associated Items</button>
{{outlet item.id asd}}
{{/each}}
</script>
在这里查看我的完整工作示例:http: //jsfiddle.net/mavilein/SNte7/4/
我的问题:您如何看待这个解决方案?我可以在不修补框架的情况下实现它吗?正如我所说,第一个提出的解决方案适用于简单模型。但我的感觉是关联的项目应该实现为模型,因此应该由 Ember 控制器控制。