Я столкнулся с очень похожей проблемой при тестировании примера приложения ToDo backbone.js в книге Разработка приложений Backbone.js от Addy Osmani с использованием Cordova (PhoneGap) и запуска его на эмуляторе Android 2.3.
Проблема, с которой я столкнулся, заключалась в том, что были сделаны первые GET или PUT для определенного URL, но последующие запросы или обновления к тому же экземпляру модели (т.е. тому же URL) не были отправлены на сервер RESTful, даже если Вызовы jQuery.ajax возвращались успешно.
Проблема оказалась в том, что браузер Android в Android 2.3 не передавал последующие запросы на тот же URL. После нахождения подтверждения здесь: http://jorgenmodin.net/index_html/jquery-and-android-2.3-calling-a-url-again-gives-the-cached-result
В итоге я изменил базовую модель и коллекцию url: functions, чтобы добавить уникальную метку времени в 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 в переопределении для магистрали. синхронизировать, но это не работает. Вот код в любом случае:
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);
};