Ember.js递归控制器和视图

时间:2013-01-23 03:32:06

标签: model-view-controller recursion nested ember.js ember-router

说我有一个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,但解决方案没有说明控制器。

1 个答案:

答案 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"}}

然后在视图中有一些逻辑似乎是合理的。如果/当可重用视图支持添加到主服务器时,您可以将该逻辑提升到控制器中。

请参阅:https://github.com/emberjs/ember.js/issues/1766