Ember JS:嵌套对象和架构

时间:2013-03-16 15:27:14

标签: ember.js

我在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

1 个答案:

答案 0 :(得分:0)

我相信你已经朝着正确的方向前进了。您需要使用control。我想这就是它被添加的原因。

在我看来,itemControllercontrol之间的区别在于itemController不需要相应的视图/模板,因此您仍然可以在同一视图中并继续模板内联,而在control中,您需要一个单独的视图和模板。

如果controlitemController中的一个获胜,我认为它将是control,因为它目前适用于两种情况(数组和单个对象),并且当前可以替换itemController 1}}。

请注意,如果您使用control代替{{#each Bs}}代替itemController,则需要定义控制器,视图和模板,而不是partial(或仅让Ember.js为你生成它们。)

像这样:

{{#each Bs}}
  {{control "showB" this}}
{{/each}}

对于D:

{{control "showD" D}}

但我同意你的观点,control仍然是错误的,itemControllercontrol非常相似,因此两者都没有意义。两者都相对较新,所以我认为这就是你找到困难的原因。但这是对github或discuss.ember.js.com

的讨论

一个荒谬的解决方法是创建一个包含D的数组的计算属性,并使用each dArrayitemController :)但是,尝试使control工作显然更好你。

最糟糕的情况是,使用{{view}}帮助器并在视图中放置一些逻辑,使其充当控制器(尽管不建议这样做)。