6

假设我有一个Action对象列表,它对应于 Ember 模型。每个都有几个属性(时间戳)和一个detail属性,可以递归地包含更多detail的s(任意深度嵌套)。您可以将详细信息视为嵌套列表。

我想编写一个 UI,允许detail对任何Action对象进行轻松编辑(自动完成值、轻松复制和粘贴、重新排序元素等)。

现在,我的DetailView模板将递归地渲染额外DetailView的 s:

{{#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作为代理的Detailsper DetailsView我可以动态实例化控制器并在视图模板中设置它们的内容吗?我对新 Ember 路由器的理解是在给定的路由中设置控制器和插座;但是,这似乎不适用于这里,因为根本没有进行路由。欢迎所有关于如何处理递归控制器/视图/路由的建议/见解。

我已经查看了EmberJS Nested Views and Controllers,但这表明我ArrayController对所有Details 都有一个,甚至跨Actions ......这也不会保留嵌套细节的树结构。

在升级到 Ember 0.9.6 后,我还查看了把手模板中的递归视图不起作用,但该解决方案没有说明任何关于控制器的内容。

4

1 回答 1

7

** 2013 年 2 月 20 日更新**

帮助程序的 API 文档{{control}}现在可在此处获得。它警告说“控制助手目前正在开发中,并且被认为是实验性的。”

要启用它,ENV.EXPERIMENTAL_CONTROL_HELPER = true请在需要 Ember 之前进行设置。

** 2013 年 2 月 3 日更新**

ember 中添加了一个新助手{{control}},实现了可重用视图提案。因此,要拥有一个DetailsController代理DetailsDetailsView您可以:

{{control 'detail' child}}

例如,参见{{control}} 测试


理想情况下,我将有一个 DetailsController 作为代理,每个 DetailsView 都有一个 Details。我可以动态实例化控制器并在视图模板中设置它们的内容吗?

通常,执行此操作的方法是通过 handlebars{{render}}助手,它使用适当的视图和控制器呈现模板。不幸的是,你不能{{render}}多次插入同一个模板,所以它不能在一个{{each}}块中使用。

最近关于这个话题进行了长时间的讨论。请参阅:非单例控制器讨论

提出了两种解决方案。第一个涉及向itemControllerClassArrayController 添加属性。如果设置了此属性,则 ArrayController 将自动将新内容包装在指定的类中。这是几周前添加到 ember 中的,它处理大多数用例,在这些用例中,您有一个平面项目列表,并希望每个项目都包含在代理中。

第二个提议,可重用视图,允许您为视图提供控制器类。

{{view UI.Calendar dateBinding="post.startDate" controllerClass="App.CalendarController"}}

这将为每个 UI.Calendar 小部件创建一个 App.CalendarController 实例,该实例将与小部件的生命周期相关联。到今天为止,这还没有实施。请参阅{{view}} 应该有一个创建控制器的选项!了解最新状态。

因此,对于您概述的用例,AFAIK 没有一个很好的方法来实现这一点。同时,将数据绑定到视图:

{{view App.DetailView contentBinding="child"}}

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

见:https ://github.com/emberjs/ember.js/issues/1766

于 2013-01-23T16:32:28.363 回答