Очистить кэш или очистить переменные JavaScript в приложении Phonegap после завершения ajax - PullRequest
3 голосов
/ 15 марта 2012

Я создал приложение для Android, используя Phonegap, jquery и Kendo UI. Также у меня есть несколько запросов AJAX.

Теперь в моем приложении у меня есть ajax-запрос на создание счета, который использует PUT для добавления данных в мой сервис Rest. Все работает, если, если я уже создал транзакцию (счет-фактуру) и пытаюсь создать другую, количество не возвращается к 1 и не создает новую транзакцию, а возвращает только последнюю транзакцию, которую я создал (ПРИМЕЧАНИЕ: она вызывает Успешный обратный звонок от моего аякса).

У меня вопрос, как я могу очистить кэш на Android без выхода из приложения.

обновление

я обнаружил, что после успешного создания счета после этого переменные по-прежнему заполняются данными, сохраненными в предыдущей транзакции. Так как я могу как-то сбросить все, чтобы позволить новые данные. Я добавил это location.reload(true);, но хотел бы найти другое решение относительно этой проблемы. спасибо.

1 Ответ

1 голос
/ 01 сентября 2013

Я столкнулся с очень похожей проблемой при тестировании примера приложения 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);  

};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...