我有一个日历应用程序,它使用ajax和json结果加载所有的事件数据。问题是我有不同的看法,现在我必须在更改视图时重新调用服务器。如何在客户端避免过多的ajax调用和缓存json数据
是否有任何建议我可以缓存这些数据在客户端的方式,并检查是否已经加载这些事件之前已经发射更多的ajax调用。
这是什么最佳做法?
我有一个日历应用程序,它使用ajax和json结果加载所有的事件数据。问题是我有不同的看法,现在我必须在更改视图时重新调用服务器。如何在客户端避免过多的ajax调用和缓存json数据
是否有任何建议我可以缓存这些数据在客户端的方式,并检查是否已经加载这些事件之前已经发射更多的ajax调用。
这是什么最佳做法?
它被称为MVC。
您需要为您的应用程序构建数据模型,编写某种Record对象,然后确定其状态。所以你的应用程序会有一些CalendarEvent
模型,当你从服务器加载数据时,你会实例化实例。
因此,在更改视图时,您首先需要检查是否有该视图的模型对象,如果是,则不需要从服务器加载它(除非要检查更改) 。
您的计划不需要那么复杂。如果通过标识加载事件,你可以这样做
window.App = {};
window.App.Models = {};
当您加载一个记录,你可以把
window.App.Models[id] = InstanceOfYourRecord
和这样的非常快,以寻找记录。或者只是使用具有强大数据层的框架(如Sproutcore)。
我在最近的项目上遇到了类似的问题。
从概念上讲,我将服务器上保存的“真实”数据模型(DM)保存到数据库中。
为了让生活更加健全,客户端保留了自己的本地数据模型。在客户端DM之外,所有客户端代码都认为它在本地拉取结果。
读取来自客户端DM它的数据(GET)时间:
当通过客户端DM它改变数据(POST):
请注意,此客户DM还有:
实现注意事项:
实例功能我在执行:
listAll:
function(contactId, cb) {
// pull from cache
if (contactId in this.notesCache) {
cb(this.notesCache[contactId]);
return;
}
// init queue if needed
this.listAllQueue[contactId] = this.listAllQueue[contactId] || [];
// pull from server
var self = this;
dataModelHelpers.getJsonOnce(
'/teafile/api/notes.php',
{'req': 'listAll', 'contact': contactId},
function(resp) { self.notesCache[contactId] = resp; },
this.listAllQueue[contactId],
cb
);
}
的getJsonOnce()辅助确保,如果多个客户端组件要求完全一样的(未缓存)的数据,我们只发出一个AJAX请求告知大家一旦它有
的notesCache只是一个简单的JavaScript对象:
this.notesCache = {};
像hvgotcodes说的那样,MVC框架会有所帮助;例如,试试backbone.js(http://documentcloud.github.com/backbone/)。
或者,您可能要考虑使用jStorage(http://www.jstorage.info/)。每次需要进行AJAX调用时,首先检查它是否在存储对象中,如果不是,则运行AJAX调用。另一方面,每当完成一次AJAX调用时,将结果存储在存储对象中。确保在数据存储中查找时需要引用某种索引(CalendarEvent ID)。可能希望为存储中的数据添加某种“过期时间”...... AJAX调用之后的时间戳记,并且如果过期,请重新提出请求。
但我将如何缓存json结果在客户端? – leora
在我自己的代码中添加了一个示例,以显示正在执行的缓存。辅助函数首先缓存JSON结果。然后它调用所有等待该结果的回调。 (listAllQueue部分)。 – nsanders