1

我正在编写一个在客户端使用 MVC 的 Flex 应用程序。它使用 GraniteDS,因此具有远程延迟加载和反向延迟加载功能。

用户登录到应用程序,然后单击一个按钮来更新他们的电子邮件地址。然后调用控制器,但我不确定接下来按哪个顺序执行操作。我可以看到以下选项:

选项

  1. 在客户端更新模型,然后将更新发送到服务器。如果服务器抛出错误,则告诉用户并要求他们重新加载 Flex 应用程序,因为数据现在不同步。否则假定更新正常;
  2. 控制器将数据发送到服务器,服务器响应后,控制器使用更新的数据更新客户端模型。如果没有收到服务器响应,则告诉用户出现错误并要求他们重新加载应用程序,因为数据现在可能不同步。

选项 2 似乎更好,但我不确定如何实现它。我有哪些选择?

解决方案

  1. 克隆MyUser并将克隆发送到服务器,当服务器返回MyUser然后更新模型。您将如何处理MyUser集合中更深的嵌套对象,因为克隆只会复制原始集合而不克隆它?
  2. MyUser.id与更改的数据一起发送到服务器。使用id在服务器上加载MyUser,然后修改其数据。一旦他们的数据在服务器上被修改,然后将MyUser返回给客户端,以便控制器可以更新他们的模型。

解决方案 2 似乎是一种非常糟糕的方法,因为它绕过了延迟/反向延迟加载的 GraniteDS 功能。

他们是这样做的最佳实践方式吗?

4

1 回答 1

0

如果您在保存 flex 对象时遇到数据冲突,重新加载整个 flex 应用程序是一种不太方便但有效且非常可靠的解决方案。对于请求:也许您应该只显示一条消息,并允许 flex 客户端重新发送请求(例如:网络问题),并且大部分时间应该没问题。如果在 n 失败后重新启动应用程序会打扰您,请添加一个计数器(您可以对 flex 应用程序进行编程以使用 URLRequest 重新加载自身)。

关于克隆 MyUser:如果您将基本 AMF 序列化与 ObjectUtil.copy() 一起使用,它将复制嵌套字段,因为它确实是基于 IExternalizable 的“深拷贝”,而花岗岩序列化基于此。所以你关于克隆对象的解决方案应该可以工作。

您可以按照自己的方式自由使用花岗岩,例如,许多人更喜欢禁用惰性功能,即使它带来了自己的问题。我觉得处理数据冲突始终是自定义的事情,不要指望一个框架,甚至 Granite 来解决所有问题。

于 2013-09-16T13:25:53.987 回答