第一个:我知道这里已经问过这个问题:in ExtJS, is it better to call Model.save() or Store.Sync()?-但是,我希望进一步研究这个问题,特别是关于最小化XHR以及客户端和服务器上不必要的开销。我认为链接的问题中没有提到这些观点中的任何一个。
我有一个专门用于企业资源管理的大型应用程序,由许多模型, View 和 Controller 组成。我通过建立对Ext.Ajax requestComplete
和requestException
事件的监听器来处理服务器中的所有响应。我采用这种方法,而不是在每个模型的代理afterRequest
事件上编写重复的事件处理程序。这使我能够使所有后端 Controller (使用Zend Framework)都响应三个参数:success
,message
和data
。
请求成功后(即HTTP 200),为requestComplete
运行的方法将检查JSON响应中是否存在上述参数。如果success
是false
,则预计message
中将包含一条错误消息,然后将其显示给用户(例如,“保存该产品时出现问题。无效的产品名称”)。如果成功为真,则根据请求的类型(即创建,读取,更新或销毁)采取措施。在成功create
之后,新记录将添加到适当的数据存储中,删除记录后将其删除,依此类推。
我选择采用这种方法,而不是将记录添加到商店并调用商店的sync
方法,以最大程度地减少XHR和往返行程。我当前保存/更新数据的方法是将请求发送到后端,并对Ext前端的结果使用react。我通过用数据填充模型并调用model.save()来创建/更新请求,或者调用model.destroy()来删除数据来做到这一点。
我发现,当从存储中添加/更新/删除记录,然后调用store.sync()时,我将不得不以一种尴尬的方式对服务器的响应使用react。例如,删除一条记录:
store.remove()
从商店中删除记录store.sync()
,因为我将商店的autoSync
设置为false
。 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和服务器/客户端开销的好方法?我很乐意提供应要求提供的示例代码,但是我觉得这是基本代码的一个相当笼统的概念。
最佳答案
我认为你 Eloquent 了自己的立场。我认为您担任的职位没有任何问题。我唯一的缺点是要指出,支持可编辑网格的商店上的autoSync设置是完成任务的冗长方式,尽管控制较少。
补充一点,您指出的开销通常是由于意外情况造成的,或者我称之为可能需要特殊处理或额外刷新数据的极端情况。您可以为这些特定情况添加监听器,并使其余功能保持默认状态。