2012-03-15 42 views
3

我使用Phonegap,jquery和Kendo UI創建了一個Android應用程序。另外我有一個多個Ajax請求。ajax完成後在Phonegap應用程序上清除緩存或清除javascript變量

現在在我的應用程序中,我有一個創建發票ajax請求,它使用PUT將數據添加到我的Rest服務。一切正常,如果我已經創建了一個交易(發票),並嘗試創建另一個數量不返回到1,它不創建一個新的交易,但只返回我創建的最後一個交易(注意:它調用成功從我的ajax回調)。

我的問題是我如何清除Android上的緩存而無需退出應用程序。

更新

我發現,當我的變量仍然充滿了從以前的交易數據存儲在成功創建發票。那麼我怎樣才能以某種方式重置一切,以允許新的數據。我加了這個location.reload(true);,但想找到關於這個問題的另一個解決方案。謝謝。

+0

任何人?關於這件事的任何想法? – jongbanaag 2012-03-16 05:04:16

回答

1

當使用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); 

};