當使用Cordova(PhoneGap)在Developing Backbone.js Applications book by Addy Osmani中測試示例ToDo backbone.js應用程序並在Android 2.3模擬器上運行它時,我遇到了非常類似的問題。
我遇到的問題是第一個GET或PUT到一個特定的URL被創建,但後續的請求或更新到相同的模型實例(即相同的URL)沒有發送到RESTful服務器,即使jQuery.ajax調用正在返回成功。
這個問題在Android 2.3中的Android瀏覽器中並未傳遞給相同URL的後續請求。在這裏找到確認之後: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以替代backbone.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);
};
任何人?關於這件事的任何想法? – jongbanaag 2012-03-16 05:04:16