说我有一个Action
对象列表,对应一个Ember模型。每个属性都有一些属性(时间戳)和detail
属性,它们可以递归地包含更多detail
s(任意深度嵌套)。您可以将详细信息视为嵌套列表。
我想编写一个UI,允许对任何detail
对象轻松编辑(自动完成值,轻松复制和粘贴,重新排序元素等)Action
。
现在,我的DetailView
模板将以递归方式呈现其他DetailView
:
{{#if view.content.hasChildren}}
{{#each child in view.content.children}}
{{#DetailView contentBinding=child}}
{{/each}}
{{#else}}
{{#EditDetailView contentBinding=view.content.value}}
{{/if}}
因此每个DetailsView
对应于Details对象树中的一个节点。
但我不清楚如何添加控制器 - 我需要存储/实现功能的额外状态(例如,转换Detail对象中的值以在DetailsView中显示;处理插入/删除/的事件重新排序元素;更改“详细信息”树的结构)既不属于模型也不属于视图。
理想情况下,每DetailsController
我会Details
作为代理DetailsView
。 我可以动态实例化控制器并在视图模板中设置其内容吗?我对新的Ember路由器的理解是在给定路径中设置控制器和插座;但是,这似乎不适用于此,因为根本没有进行路由。有关如何处理递归控制器/视图/路径欢迎的所有建议/见解。
我已经看了EmberJS Nested Views and Controllers,但是我建议所有ArrayController
都有一个Detail
,即使在Action
之内......这样做不保留嵌套细节的树结构。
我也看了Recursive view in handlebars template not working after upgrading to Ember 0.9.6,但解决方案没有说明控制器。
答案 0 :(得分:7)
**更新2013年2月20日**
{{control}}
帮助程序的API文档现在可用here。它警告说“控制助手目前正在开发中并被认为是实验性的。”
要启用它,请在要求Ember之前设置ENV.EXPERIMENTAL_CONTROL_HELPER = true
。
**更新2013年2月3日**
新的帮助器{{control}}
已添加到ember中,实施可重用的视图提案。因此,要DetailsController
代理每Details
DetailsView
,您只需:{/ p>
{{control 'detail' child}}
例如,请参阅the {{control}} tests
理想情况下,我有一个DetailsController作为代理,每个DetailsView的详细信息。我可以动态实例化控制器并在视图模板中设置其内容吗?
通常,执行此操作的方法是通过把手{{render}}
帮助程序,该帮助程序使用适当的视图和控制器呈现模板。很遗憾,您无法使用{{render}}
多次插入同一模板,因此无法在{{each}}
块中使用。
最近对这个话题进行了长时间的讨论。请参阅:Non-Singleton Controller Discussion!
提出了两种解决方案。第一个涉及向ArrayController添加itemControllerClass
属性。如果设置了此属性,ArrayController将自动将新内容包装在指定的类中。这是几周前添加到ember中并负责大多数用例,在这些用例中你有一个项目的平面列表,并希望每个项目都包含在代理中。
第二个提案可重用视图允许您为视图提供控制器类。
{{view UI.Calendar dateBinding="post.startDate" controllerClass="App.CalendarController"}}
这将为每个UI.Calendar小部件创建一个App.CalendarController实例,该实例将与小部件的生命周期相关联。截至今天,这还没有实施。见{{view}} should have an option to create a controller!获取最新状态。
所以AFAIK没有良好的方法来完成这个用于你概述的用例。同时,将数据绑定到视图:
{{view App.DetailView contentBinding="child"}}
然后在视图中有一些逻辑似乎是合理的。如果/当可重用视图支持添加到主服务器时,您可以将该逻辑提升到控制器中。