为什么ember在单独访问路由时使用相同的控制器实例?

时间:2013-04-26 15:38:53

标签: ember.js

问题:

当用户重新进入路由时,我遇到了重新使用旧控制器实例的概念性问题。在许多示例中,控制器将用户交互的状态存储在实例变量中。当用户重新进入控制器时,应该重置那些,但是没有明确的机制可以这样做。

因此,必须有充分的理由使用单个控制器实例。它是什么?

我是如何解决这个问题的:

我在Ember应用程序中遇到了一个错误,控制器根据其他地方的用户操作保持本地状态不同步。控制器维持用户是否正在编辑“案例”的“名称”的状态。当控制器被实例化时,设置为“true”,但是当用户取消时,它被设置为“false”。然后用户离开到不同的路线并返回到相同的路线。我得到了一个已经有“false”的控制器实例来编辑名称。我希望能有“真实”。

Ember v.s.导轨:

我来自Rails透视图,其中控制器针对每个请求进行实例化。请求之间没有共享控制器状态。所有实例变量都是请求的本地变量,因此可以安全地使用它们。

回到问题: 为什么ember在单独访问路由时使用相同的控制器实例?

2 个答案:

答案 0 :(得分:4)

控制器在ember和rails中的作用是非常不同的。在rails中,如您所知,控制器用作准备数据以进行演示的请求的管道。如果你考虑使用ember中的用例,这是一个主要由路由器扮演的角色。

在您的示例中,您提到编辑状态已不同步。您可以通过多种方式解决此问题,例如,您可以将修改状态移至模型,因此您可以调用isEditing(或仅model.isEditing而不是isEditing而不是{{1}}你正在使用ObjectController)。另一种选择是在进入路线时重置控制器的状态。

另一个应该说明这种差异的例子是表单上的保存按钮。最初你可能会想“哦,我要在我的控制器上放一个保存动作”。这是合乎逻辑的,当你考虑像铁路开发人员,但保存模型是路由器的责任(特别是如果它导致改变当前路由,因为这是从控制器有意做的事情)。 p>

在ember中,控制器的角色是模型和视图之间的管道。控制器实例被重用的事实有点令人困惑,但实际上并不那么重要。当您更改或返回路径时,控制器的模型/上下文是不同的,这就是视图状态应该存在于模型中的位置。

答案 1 :(得分:1)

虽然控制器通常是单例,但当您使用指定模型的{{render}}时,您将获得一个新实例化的控制器。请参阅“使用多个模型渲染”下的rc2 release notes。我是Ember的新手,这种差异让我感到困惑。

在尝试保持每个模型实例用户交互状态时使用单例控制器似乎很棘手。正如jonnii所说,你可以把状态放在模型上,这样可行,但它会扰乱数据模型。我尝试过的另一件事是在控制器中放置一个贴图(由模型键入,值是用户交互状态的对象),但这似乎是我期望框架提供的一些笨拙的重新实现。还在努力......