She*_* Yu 6 model-view-controller recursion nested ember.js ember-router
假设我有一个Action对象列表,它对应于Ember模型.每个都有一些属性(时间戳)和一个detail属性,它可以递归地包含更多的details(任意深度嵌套).您可以将详细信息视为嵌套列表.
我想编写一个UI,允许detail对任何Action对象进行简单编辑(自动完成值,轻松复制和粘贴,重新排序元素等).
现在,我的DetailView模板将递归渲染额外的DetailViews:
{{#if view.content.hasChildren}}
{{#each child in view.content.children}}
{{#DetailView contentBinding=child}}
{{/each}}
{{#else}}
{{#EditDetailView contentBinding=view.content.value}}
{{/if}}
Run Code Online (Sandbox Code Playgroud)
因此,每个DetailsView对应于Details对象树中的一个节点.
但我不清楚如何添加控制器到混合 - 我需要存储/功能实现的额外状态(例如,转换Detail对象中的值以在DetailsView中显示;处理插入/删除/重新排序元素的事件;更改"详细信息"树的结构,既不属于模型也不属于视图.
理想的情况是我想有一个DetailsController服务作为代理Details每DetailsView.我可以动态实例化控制器并在视图模板中设置其内容吗?我对新的Ember路由器的理解是在给定的路径中设置控制器和插座; 但是,这似乎不适用于此,因为根本没有进行路由.有关如何处理递归控制器/视图/路径欢迎的所有建议/见解.
我已经看过EmberJS嵌套视图和控制器了,但是我建议我有一个单独ArrayController的所有Details,甚至跨越Action...这也不会保留嵌套细节的树结构.
我还看了升级到Ember 0.9.6之后车把模板中的递归视图无效,但解决方案没有说明控制器的任何内容.
**更新2013年2月20日**
{{control}}现在可以在此处获得帮助程序的API文档.它警告说"控制助手目前正在开发中并被认为是实验性的."
要启用它,请ENV.EXPERIMENTAL_CONTROL_HELPER = true在要求Ember之前设置.
**更新2013年2月3日**
{{control}}在ember中添加了一个新助手,实现了可重用视图提议.所以有一个DetailsController代理一个Details每个DetailsView你可以:
{{control 'detail' child}}
Run Code Online (Sandbox Code Playgroud)
看到的{{控制}}测试例如
理想情况下,我将有一个DetailsController作为代理每个DetailsView的详细信息.我可以动态实例化控制器并在视图模板中设置其内容吗?
通常,执行此操作的方法是通过把手{{render}}帮助程序,该帮助程序呈现具有适当视图和控制器的模板.遗憾的是,您不能使用{{render}}多次插入相同的模板,因此不能在{{each}}块中使用它.
最近对这个话题进行了长时间的讨论.请参阅:非单独控制器讨论!
提出了两种解决方案.第一个涉及向itemControllerClassArrayController 添加属性.如果设置了此属性,ArrayController将自动将新内容包装在指定的类中.这是几周前添加到ember中并负责大多数用例,在这些用例中你有一个项目的平面列表,并希望每个项目都包含在代理中.
第二个提议" 可重用视图 "允许您为视图提供控制器类.
{{view UI.Calendar dateBinding="post.startDate" controllerClass="App.CalendarController"}}
Run Code Online (Sandbox Code Playgroud)
这将为每个UI.Calendar小部件创建一个App.CalendarController实例,该小实例将绑定到小部件的生命周期.截至今天,这还没有实施.请参阅{{view}}应该有一个创建控制器的选项!了解最新状态.
因此,对于您概述的用例,AFAIK没有很好的方法来完成此任务.同时,将数据绑定到视图:
{{view App.DetailView contentBinding="child"}}
Run Code Online (Sandbox Code Playgroud)
然后在视图中有一些逻辑似乎是合理的.如果/当可重用视图支持添加到主站时,您可以将该逻辑提升到控制器中.
请参阅:https://github.com/emberjs/ember.js/issues/1766