7

我很想知道关于新的 ember 路由和控制器,哪一层的逻辑是什么:

如果我们以下面的路线为例:

step1: Ember.Route.extend
  route: '/step1'
    connectOutlets: (router, event) ->
      exercise = WZ.Exercise.createRecord()
      router.get('exercisesNewStep1Controller').set 'groups', WZ.store.find(WZ.Group)
      router.get('exercisesNewController').connectOutlet 'step', 'exercisesNewStep1', exercise

我的 ExercisesNewStep1Controller 目前是无逻辑的:

WZ.ExercisesNewStep1Controller = Em.Controller.extend()

建议的建议似乎是让路由只负责将正确的插座分配给正确的控制器,并使用控制器中的任何其他逻辑。

我应该将我的控制器重构为如下所示:

WZ.ExercisesNewStep1Controller = Em.Controller.extend
  createGroup: ->
    @set 'groups', WZ.store.find(WZ.Group)

这是一个非常简单的例子,但我认为逻辑成立。

我有点困惑所有图层的位置。我认为必须创建所有这些 xxxController、xxxView 文件并在它们之间进行耦合会产生少量开销。

我喜欢 ember,但我只想提出这一点。

4

3 回答 3

5

我与 Tilde 团队进行了几次交流,Tom Dale 教我们遵循hvgotcodes提出的方式。

但在与 Peter Wagenet 讨论后出现了改进:作为对我的询问的答复,Peter & Yehuda减轻了我们对 Tom 解释的立场。

所以我会总结整个画面说:

  • 行为应该在路由的事件处理程序中进行高级编码,
  • 但是分解的低级原语可能(/应该?)在控制器中本地化。

原因是任何处理都应该在给定的路由范围内,以确保整个应用程序的一致行为,而不是向应用程序的任何部分开放所有可能的处理。

于 2012-07-26T13:24:33.833 回答
4

在 Sproutcore 中(如果这不适用于从 Sproutcore 派生的 Ember,有人会说出来),控制器应该几乎总是只是愚蠢的代理。他们什么都不做。

假设这适用于 Ember,我不会将逻辑移到那里。

推荐的建议似乎是让路由只负责将正确的插座分配给正确的控制器,并使用控制器中的任何其他逻辑。

我认为这是正确的。从我在网上看到的例子来看,路由只是状态。转到github,这个链接,你会看到 Routes 扩展了 State。所以应用程序级别的事件应该在你的路由(即状态)中处理。在这里您可以获得相关对象并将它们放入适用的控制器中。

于 2012-07-26T12:05:54.600 回答
2

https://speakerdeck.com/u/tomdale/p/emberjs-more-than-meets-the-eye幻灯片 55。

事实上,我不知道它是否与当前的良好实践保持同步,但模型管理(创建/编辑/删除)似乎没有在任何地方表示。在我看来,它必须响应视图事件以及在 connectedOutlets 方法中完成。所以你的第一个例子对我来说看起来不错。此外,在这张幻灯片中,控制器应该包含非常少的逻辑……但什么是真正的“非常少的逻辑”?

您的问题对我来说非常重要,因为我们没有任何其他建议,尤其是来自经验丰富的 ember 用户。

于 2012-07-26T10:21:43.723 回答