Joh*_*all 6 javascript performance extjs
首先:我在这里已经意识到这个问题:在ExtJS中,调用Model.save()或Store.Sync()会更好吗? - 但是我希望进一步研究这个问题,特别是在最小化客户端和服务器上的XHR和不必要的开销方面.我不认为在相关问题中解决了这些问题.
我有一个用于企业资源管理的大型应用程序,包括许多模型,视图和控制器.我通过建立Ext.Ajax requestComplete和requestException事件的监听器来处理来自我的服务器的所有响应.我采用这种方法而不是在每个模型的代理afterRequest事件上编写重复的事件处理程序.这使我有我所有的后端(使用Zend Framework)控制器,具有三个参数响应:success,message和data.
在成功请求(即HTTP 200)之后,运行for的方法requestComplete将检查上述参数的JSON响应.如果success是false,则预计将包含错误消息message,然后将其显示给用户(例如,"保存该产品时出现问题.产品名称无效").如果成功,则根据请求的类型采取操作,即创建,读取,更新或销毁.成功后create,新记录被添加到相应的数据存储中,删除后记录被销毁,依此类推.
我选择采用这种方法,而不是将记录添加到商店并调用商店的sync方法,以便最小化XHR和其他往返.我目前保存/更新数据的方法是将请求发送到后端并对Ext前端的结果做出反应.我这样做是通过使用数据填充模型并为创建/更新请求调用model.save()或使用model.destroy()来删除数据.
我发现当从商店添加/更新/删除记录,然后调用store.sync()时,我将不得不以一种让人觉得尴尬的方式对服务器的响应作出反应.例如,删除记录:
store.remove()store.sync()因为我有商店的autoSync设置而调用false.success: false,但是记录将已从ExtJS数据存储中删除.store.sync(),store.load()(都需要往返)或者从该请求的记录,并将其重新添加到商店后面是commitChanges()避免调用额外的同步/负载和因此避免不必要的往返.添加记录也是如此,如果服务器在向数据库添加数据时某处失败,则记录仍在ExtJS存储中,必须手动删除以避免使用store.sync()或者往返store.load().
为了避免这个问题,正如我之前解释的那样,我实例化了我的一个模型对象(例如产品模型),用数据填充它,然后调用myModel.save().反过来,这会调用代理create或update依赖于模型的ID,并触发相应的AJAX请求.如果后端发生故障,前端存储仍未更改.在成功的请求(读取:success: true,而不是HTTP 200)上,我手动将记录添加到存储并调用store.commitChanges(true),有效地将存储与数据库同步,而无需额外的往返并避免不必要的开销.对于所有请求,服务器将使用新的/修改的数据以及成功参数进行响应,并有条件地在客户端上显示消息.
我在这里遗漏了什么,或者这种方法是否是最小化XHR和服务器/客户端开销的好方法?我很乐意提供应该请求的示例代码,但我觉得这是一个基本代码的相当普遍的概念.
我认为你已经雄辩地论证了你的立场。我不认为你所采取的立场有什么问题。我唯一的责备是指出,支持可编辑网格的商店上的自动同步设置是完成任务的一种不那么冗长的方式,尽管控制较少。
要补充的是,您指出的开销通常是由于意外情况造成的,或者我会称之为可能需要特殊处理或额外刷新数据的边缘情况。您可以为这些特定情况添加侦听器,并让其余的功能保持简洁的默认值。