覆盖Backbone的URL函数以从本地存储中获取数据

时间:2014-10-02 13:39:03

标签: javascript caching backbone.js

我正在编写一个与骨干一起工作的缓存系统(我还是新手)。 系统如下:

首先尝试从本地存储中获取数据,如果不这样做,则调用服务器。

我是否可以覆盖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()

1 个答案:

答案 0 :(得分:1)

要回答这个问题,首先需要对fetch进行快速入门。当你这样做时:

someModel.fetch();

幕后发生的事情是:

  1. fetch使用url(或urlRoot)方法/属性来确定进行AJAX调用的位置
  2. fetch使用sync方法实际进行AJAX调用。
  3. 在AJAX调用返回后,fetch将通过parse传回的内容传递回来,然后将其传递给set
  4. 鉴于此,您显然不希望覆盖url,因为它与您要替换的实际AJAX部分无关。您可以覆盖fetch,这样就可以了:

    fetch: function() {
        var fetched = this.getLocalVersion();
        if (fetched) {
            return new $.Deferred().resolve();
        } else {
            return this.prototype.fetch.apply(this, arguments);
        }
     }
    

    但是,当你想要savedelete Model时,这对你没有帮助,所以sync(涵盖所有AJAX操作)可能是理想的覆盖方法。

    ......当然,重新发明轮子是没有意义的,所以不要覆盖任何你最好的选择,可能是使用现有的Backbone LocalStorage库。