我正在编写一个与骨干一起工作的缓存系统(我还是新手)。 系统如下:
首先尝试从本地存储中获取数据,如果不这样做,则调用服务器。
我是否可以覆盖url()函数以首先检查本地存储然后进行调用,或者该机制应该在url()和骨干之外?也许这是错误地使用骨干?
谢谢!
修改
根据要求,我正在添加更多细节。
我正在使用backbone.js我通过require.js使用的特定库是backbone_amd-min。
代码示例:
型号:
define([ 'jquery', 'underscore', 'backbone', 'cacher' ], function($, _, Backbone, cacher) {
var article = Backbone.Model.extend({
defaults : {
title : '',
content : '',
},
parse : function(response, xhr) {
return response;
},
url : function() {
//What I want to do is (specify where to retrieve the article):
var articleInCache = cacher.inCache(this.flag);
if(articleInCache)
return localStorage
else
return remoteUrl;
},
flag : '2'
});
return article;
});
我可以修改url(),还是应该修改fetch()
答案 0 :(得分:1)
要回答这个问题,首先需要对fetch
进行快速入门。当你这样做时:
someModel.fetch();
幕后发生的事情是:
fetch
使用url
(或urlRoot
)方法/属性来确定进行AJAX调用的位置fetch
使用sync
方法实际进行AJAX调用。fetch
将通过parse
传回的内容传递回来,然后将其传递给set
。鉴于此,您显然不希望覆盖url
,因为它与您要替换的实际AJAX部分无关。您可以覆盖fetch
,这样就可以了:
fetch: function() {
var fetched = this.getLocalVersion();
if (fetched) {
return new $.Deferred().resolve();
} else {
return this.prototype.fetch.apply(this, arguments);
}
}
但是,当你想要save
或delete
Model
时,这对你没有帮助,所以sync
(涵盖所有AJAX操作)可能是理想的覆盖方法。
......当然,重新发明轮子是没有意义的,所以不要覆盖任何你最好的选择,可能是使用现有的Backbone LocalStorage库。