【发布时间】:2012-10-31 16:30:21
【问题描述】:
FIRST: 我知道这里有人问过这个问题:in ExtJS, is it better to call Model.save() or Store.Sync()? - 但是我希望进一步研究这个问题,特别是关于最小化 XHR 和客户端和服务器上不必要的开销。我认为链接的问题中没有解决这些问题。
我有一个为企业资源管理设计的大型应用程序,由许多模型、视图和控制器组成。我通过建立 Ext.Ajax requestComplete 和 requestException 事件的侦听器来处理来自我的服务器的所有响应。我采用了这种方法,而不是在每个模型的代理 afterRequest 事件上编写重复的事件处理程序。这使我能够让我的所有后端(使用 Zend 框架)控制器响应三个参数:success、message 和 data。
在成功请求(即 HTTP 200)后,为requestComplete 运行的方法将检查 JSON 响应中的上述参数。如果success 是false,则预计message 中将包含一条错误消息,然后将其显示给用户(例如,“保存该产品时出现问题。产品名称无效”)。如果成功为真,则根据请求的类型采取行动,即创建、读取、更新或销毁。 create 成功后,新记录被添加到适当的数据存储中,删除后记录被销毁,依此类推。
我选择采用这种方法,而不是向存储中添加记录并调用存储的 sync 方法,以最大程度地减少 XHR 和其他往返行程。我目前保存/更新数据的方法是将请求发送到后端并在 Ext 前端对结果做出反应。为此,我使用数据填充模型并调用 model.save() 来创建/更新请求,或调用 model.destroy() 来删除数据。
我发现,当从存储中添加/更新/删除记录,然后调用 store.sync() 时,我不得不以一种尴尬的方式对服务器的响应做出反应。以删除记录为例:
- 首先,通过
store.remove()从存储中删除记录 - 调用
store.sync(),因为我将商店的autoSync设置为false。 - 这会触发来自商店模型代理的 AJAX 销毁请求。
- 这就是奇怪的地方......如果从数据库中删除行时服务器上出现错误,响应将返回
success: false,但是该记录已经从 ExtJS 数据存储中删除。 - 此时,我可以调用
store.sync()、store.load()(两者都需要往返)或从请求中获取记录并将其添加回商店,然后再添加commitChanges()以避免调用额外的同步/加载,从而避免不必要的往返。
添加记录也是如此,如果服务器在向数据库添加数据时出现故障,记录仍在 ExtJS 存储中,必须手动删除以避免与store.sync() 或store.load() 的往返。
如前所述,为了避免整个问题,我实例化了一个模型对象(例如 Product 模型),用数据填充它,然后调用 myModel.save()。这反过来根据模型的 ID 调用代理的 create 或 update,并触发适当的 AJAX 请求。如果后端发生故障,前端存储仍然保持不变。在成功的请求(阅读:success: true,而不是 HTTP 200)上,我手动将记录添加到存储并调用store.commitChanges(true),从而有效地将存储与数据库同步,无需额外的往返行程并避免不必要的开销。对于所有请求,服务器将响应新的/修改的数据以及成功参数,并有条件地在客户端上显示一条消息。
我在这里遗漏了什么,或者这种方法是最小化 XHR 和服务器/客户端开销的好方法吗?如果需要,我很乐意提供示例代码,但是我觉得这是一个包含基本代码的相当笼统的概念。
【问题讨论】:
-
看看这个[链接][1],我发现它很有帮助[1]:stackoverflow.com/questions/11022616/…
-
@Amin 谢谢你这些肯定是有用的方法!我对应用程序的大部分部分执行 model.save(),但是在使用内置存储同步时这将非常有用。谢谢!
标签: javascript performance extjs