我使用Phonegap,jquery和Kendo UI创建了一个Android应用程序。我也有多个ajax请求。
现在我的应用程序上有一个创建发票ajax请求,它使用PUT将数据添加到我的Rest服务。一切正常,如果我已经创建了一个交易(发票)并尝试创建另一个,数量不会恢复为1并且它不会创建新的交易但只返回我创建的最后一个交易(注意:它调用来自我的ajax的成功回调)。
我的问题是如何在不退出应用程序的情况下清除android上的缓存。
我发现当我成功创建发票之后,变量仍然填充了先前交易中存储的数据。那么我怎么能以某种方式重置所有内容以允许新数据。我添加了这个location.reload(true);
,但想找到关于这个问题的另一个解决方案。谢谢。
答案 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);
};