ajax完成后,在Phonegap应用程序上清除缓存或清除javascript变量

时间:2012-03-15 14:15:31

标签: javascript jquery android ajax cordova

我使用Phonegap,jquery和Kendo UI创建了一个Android应用程序。我也有多个ajax请求。

现在我的应用程序上有一个创建发票ajax请求,它使用PUT将数据添加到我的Rest服务。一切正常,如果我已经创建了一个交易(发票)并尝试创建另一个,数量不会恢复为1并且它不会创建新的交易但只返回我创建的最后一个交易(注意:它调用来自我的ajax的成功回调)。

我的问题是如何在不退出应用程序的情况下清除android上的缓存。

更新

我发现当我成功创建发票之后,变量仍然填充了先前交易中存储的数据。那么我怎么能以某种方式重置所有内容以允许新数据。我添加了这个location.reload(true);,但想找到关于这个问题的另一个解决方案。谢谢。

1 个答案:

答案 0 :(得分:1)

在使用Cordova(PhoneGap)在Developing Backbone.js Applications book by Addy Osmani中测试示例ToDo backbone.js应用程序并在Android 2.3模拟器上运行时,我遇到了类似的问题。

我遇到的问题是对特定URL的第一个GET或PUT正在制作,但是对同一模型实例(即相同的URL)的后续请求或更新未发送到RESTful服务器,即使jQuery.ajax调用正在恢复成功。

Android 2.3中的Android浏览器没有传递后续请求到同一个网址的问题。在此处找到确认后:http://jorgenmodin.net/index_html/jquery-and-android-2.3-calling-a-url-again-gives-the-cached-result 我最终修改了骨干模型和集合url:函数,以便为URL附加一个唯一的时间戳。这使得每个URL都是唯一的,然后浏览器每次都按照最初的要求发出ajax请求。

以下是我用于集合的代码摘录:

var TodoList = Backbone.Collection.extend({

   // Reference to this collection's model.
   model: app.Todo,

   urlRoot: 'http://<RESTful_server_address_goes_here>/todos/',

   url: function() {
       var base = _.result(this, 'urlRoot') || urlError();
       var ts = new Date().getTime();
       // Make sure that there is a trailing slash on the url, and add a timestamp
       return base + (base.charAt(base.length - 1) === '/' ? '' : '/') + '?_' + ts;
   },

   ...
});

这里是模型代码的摘录:

  app.Todo = Backbone.Model.extend({

      url: function() {
          var base = _.result(this.collection, 'urlRoot') || urlError();
          // if not creating a new item, then append the item id
          if (!this.isNew()) base = base + 
                               (base.charAt(base.length - 1) === '/' ? '' : '/') + 
                               encodeURIComponent(this.id);
          // now append a timestamp
          var ts = new Date().getTime();
          return base + '?_' + ts;
      },

      ...
  });

请注意,在我提出此解决方案之前尝试的很多事情中,只需将jQuery.ajax缓存(请参阅jQuery.ajax文档)设置为 false 覆盖骨干网.sync,但这不起作用。无论如何这是代码:

app.sync = function(method, model, options) {

          // THIS DOES NOT FIX THE PROBLEM !!
          // IT ONLY PREVENTS CACHING ON GET OPERATIONS 
          // HOWEVER PUT OPERATIONS ARE STILL CACHED BY ANDROID 2.3 BROWSER!!
          options.cache = false;

      return Backbone.sync(method, model, options);  

};