4

问题:

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

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

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

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

Ember 与 Rails:

我来自 Rails 的角度,控制器为每个请求实例化。请求之间没有共享控制器状态。所有实例变量都是请求的本地变量,因此可以安全使用。

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

4

2 回答 2

4

ember 和 rails 中控制器的角色非常不同。如您所知,在 Rails 中,控制器用作请求准备呈现数据的管道。如果考虑 ember 中的用例,这是主要由路由器扮演的角色。

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

应该说明这种差异的另一个示例是表单上的保存按钮。最初您可能会想“哦,我要在我的控制器上执行保存操作”。这是合乎逻辑的,当您像 Rails 开发人员一样思考时,但保存模型是路由器的责任(特别是如果它导致更改当前路由,因为这是故意难以从控制器执行的操作)。

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

于 2013-04-26T16:00:26.877 回答
1

尽管控制器通常是单例的,但当您使用 {{render}} 和指定模型时,您将获得一个新实例化的控制器。请参阅“对多个模型使用渲染”下的rc2 发行说明。我是 Ember 的新手,这种差异让我很困惑。

在尝试保持每个模型实例的用户交互状态时使用单例控制器似乎很棘手。正如 jonnii 所说,您可以将状态放在模型上,这很有效,但它会破坏数据模型。我尝试的另一件事是在控制器中放置一个映射(由模型键入,值是用户交互状态的对象),但这似乎是对我期望框架提供的东西的笨拙重新实现。还在做这个...

于 2013-04-26T19:15:57.633 回答