我在Ember中遇到了很多(痛苦的)嵌套对象的问题。我想我可能会以错误的方式解决问题,因为我怀疑它是一个相当标准的事情。
假设我有一个“有很多”B的对象A,并且每个B“都有很多”C等(这个架构基本上与我的关系数据库模式匹配)。
我不需要这些嵌套路由,所以我认为渲染像A这样的对象的一种自然方法是使用partials。类似的东西:
A的模板:
...A stuff...
{{#each Bs}}
{{ partial "show_B" }}
{{/each}}
等等。
问题是我希望子对象拥有自己的控制器。我知道自RC1(http://emberjs.com/blog/2013/02/15/ember-1-0-rc.html)以来有新的itemController是有用的,但不知何故有限。让我们说在层次结构的更下方,C对象每个都有一个D对象。所以C模板看起来像这样:
... C stuff...
{{#with c.D}}
{{ partial "show_D" }} // How do I get this partial to have its own controller?
{{/with}}
我想新的{{control}}
可以在这里提供帮助,但我在使用它时遇到了很多麻烦(上下文没有正确设置)。此外,在我看来,如果它刚刚被添加(并且仍在开发中),它可能意味着应该有另一种方法来做到这一点。最后,使用两个不同的API感觉有点奇怪:“itemController”用于项目列表,“{{control}}”用于单个项目 - 在一天结束时,我只是想将一个对象绑定到一个两种情况下的控制器。
有人能指出我在正确的方向吗?
谢谢!
PJ
答案 0 :(得分:0)
我相信你已经朝着正确的方向前进了。您需要使用control
。我想这就是它被添加的原因。
在我看来,itemController
和control
之间的区别在于itemController
不需要相应的视图/模板,因此您仍然可以在同一视图中并继续模板内联,而在control
中,您需要一个单独的视图和模板。
如果control
或itemController
中的一个获胜,我认为它将是control
,因为它目前适用于两种情况(数组和单个对象),并且当前可以替换itemController
1}}。
请注意,如果您使用control
代替{{#each Bs}}
代替itemController
,则需要定义控制器,视图和模板,而不是partial
(或仅让Ember.js为你生成它们。)
像这样:
{{#each Bs}}
{{control "showB" this}}
{{/each}}
对于D:
{{control "showD" D}}
但我同意你的观点,control
仍然是错误的,itemController
与control
非常相似,因此两者都没有意义。两者都相对较新,所以我认为这就是你找到困难的原因。但这是对github或discuss.ember.js.com
一个荒谬的解决方法是创建一个包含D的数组的计算属性,并使用each dArray
和itemController
:)但是,尝试使control
工作显然更好你。
最糟糕的情况是,使用{{view}}
帮助器并在视图中放置一些逻辑,使其充当控制器(尽管不建议这样做)。