【问题标题】:ExtJS 4.1 - Store.add() (followed by sync) vs Model.save()ExtJS 4.1 - Store.add()(后跟同步)与 Model.save()
【发布时间】:2012-10-31 16:30:21
【问题描述】:

FIRST: 我知道这里有人问过这个问题:in ExtJS, is it better to call Model.save() or Store.Sync()? - 但是我希望进一步研究这个问题,特别是关于最小化 XHR 和客户端和服务器上不必要的开销。我认为链接的问题中没有解决这些问题。

我有一个为企业资源管理设计的大型应用程序,由许多模型、视图和控制器组成。我通过建立 Ext.Ajax requestCompleterequestException 事件的侦听器来处理来自我的服务器的所有响应。我采用了这种方法,而不是在每个模型的代理 afterRequest 事件上编写重复的事件处理程序。这使我能够让我的所有后端(使用 Zend 框架)控制器响应三个参数:successmessagedata

在成功请求(即 HTTP 200)后,为requestComplete 运行的方法将检查 JSON 响应中的上述参数。如果successfalse,则预计message 中将包含一条错误消息,然后将其显示给用户(例如,“保存该产品时出现问题。产品名称无效”)。如果成功为真,则根据请求的类型采取行动,即创建、读取、更新或销毁。 create 成功后,新记录被添加到适当的数据存储中,删除后记录被销毁,依此类推。

我选择采用这种方法,而不是向存储中添加记录并调用存储的 sync 方法,以最大程度地减少 XHR 和其他往返行程。我目前保存/更新数据的方法是将请求发送到后端并在 Ext 前端对结果做出反应。为此,我使用数据填充模型并调用 model.save() 来创建/更新请求,或调用 model.destroy() 来删除数据。

我发现,当从存储中添加/更新/删除记录,然后调用 store.sync() 时,我不得不以一种尴尬的方式对服务器的响应做出反应。以删除记录为例:

  1. 首先,通过store.remove()从存储中删除记录
  2. 调用store.sync(),因为我将商店的autoSync 设置为false
  3. 这会触发来自商店模型代理的 AJAX 销毁请求。
  4. 这就是奇怪的地方......如果从数据库中删除行时服务器上出现错误,响应将返回success: false,但是该记录已经从 ExtJS 数据存储中删除。
  5. 此时,我可以调用 store.sync()store.load()(两者都需要往返)或从请求中获取记录并将其添加回商店,然后再添加 commitChanges() 以避免调用额外的同步/加载,从而避免不必要的往返。

添加记录也是如此,如果服务器在向数据库添加数据时出现故障,记录仍在 ExtJS 存储中,必须手动删除以避免与store.sync()store.load() 的往返。

如前所述,为了避免整个问题,我实例化了一个模型对象(例如 Product 模型),用数据填充它,然后调用 myModel.save()。这反过来根据模型的 ID 调用代理的 createupdate,并触发适当的 AJAX 请求。如果后端发生故障,前端存储仍然保持不变。在成功的请求(阅读:success: true,而不是 HTTP 200)上,我手动将记录添加到存储并调用store.commitChanges(true),从而有效地将存储与数据库同步,无需额外的往返行程并避免不必要的开销。对于所有请求,服务器将响应新的/修改的数据以及成功参数,并有条件地在客户端上显示一条消息。

我在这里遗漏了什么,或者这种方法是最小化 XHR 和服务器/客户端开销的好方法吗?如果需要,我很乐意提供示例代码,但是我觉得这是一个包含基本代码的相当笼统的概念。

【问题讨论】:

  • 看看这个[链接][1],我发现它很有帮助[1]:stackoverflow.com/questions/11022616/…
  • @Amin 谢谢你这些肯定是有用的方法!我对应用程序的大部分部分执行 model.save(),但是在使用内置存储同步时这将非常有用。谢谢!

标签: javascript performance extjs


【解决方案1】:

我认为你已经雄辩地论证了你的立场。我认为你所采取的立场没有任何问题。我唯一的指责是指出支持可编辑网格的商店上的自动同步设置是完成任务的一种不那么冗长的方式,尽管控制较少。

补充一点,您指出的开销通常是由于意外,或者我会称为可能需要特殊处理或额外刷新数据的边缘情况。您可以为这些特定情况添加侦听器,其余部分使用简洁的默认设置。

【讨论】:

  • 感谢您的意见。我承认我对同步与保存导致的实际数据包大小和整体网络流量并没有太多研究,我一直想解决这个问题。我喜欢你通过触发事件来处理古怪交易的方法——我将不得不修改这种方法,看看它的感觉如何。为有见地的评论 +1
  • 同步和保存之间应该没有任何区别,因为它们都使用相同的(可能)代理与服务器通信。
猜你喜欢
  • 2013-08-19
  • 2012-07-20
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-26
  • 2013-04-03
  • 1970-01-01
相关资源
最近更新 更多