2012-05-11 27 views
3

我正在使用backbone-tastypie,但我有最艱難的時間才能正常工作。在Tastypie中,我爲我的資源使用了ApiKeyAuthentication,因此每個ajax請求都需要將apikey和用戶名附加到請求的末尾,或發送添加用戶名和api密鑰的其他標頭。如何覆蓋Backbone.sync,以便在最後添加apikey和用戶名?

我想刪除一個視圖,並使用骨幹用下面的代碼它的型號:

// Remove the goal update view from the DOM 
removeItem: function() { 
    this.model.destroy({wait: true, success: function() { 
    console.log("success"); 
    }, error: function() { 
    console.log("error"); 
    }}); 
}, 

功能執行後,瀏覽器嘗試做以下網址的GET請求:

:8000/api/v1/update/2/ 

它最後沒有包含api_key或用戶名,並且在url的末尾有一個尾部的斜線。我認爲它試圖使用Backbone.oldSync來執行GET請求。我如何做到這一點,所以同步確實在最後包含了用戶名/ api鍵並刪除了最後一個斜槓?

在所有其他的請求,我做了這麼API密鑰和用戶名被追加到HTTP請求的末尾加入以下代碼骨幹-tastypie:

if (!resp && (xhr.status === 201 || xhr.status === 202 || xhr.status === 204)) { // 201 CREATED, 202 ACCEPTED or 204 NO CONTENT; response null or empty. 
    var location = xhr.getResponseHeader('Location') || model.id; 
    return $.ajax({ 
     url: location + "?" + "username=" + window.app.settings.credentials.username + "&api_key=" + window.app.settings.credentials.api_key, 
     success: dfd.resolve, 
     error: dfd.reject, 
    }); 
} 
+0

可能重複的[如何重寫Backbone.sync?](http://stackoverflow.com/questions/5096549/how-to-override -backbone-sync) – Ben

回答

17

讓我們探索可能性

使用頁眉

Backbone.sync仍然只是使用jQuery的阿賈克斯這樣你就可以覆蓋ajaxSend並使用標頭一起發送的信息。

$(document).ajaxSend(function(e, xhr, options) 
{ 
    xhr.setRequestHeader("username", window.app.settings.credentials.username); 
    xhr.setRequestHeader("api_key", window.app.settings.credentials.api_key); 
}); 

使用Ajax選項

如果您需要發送的只是一個或兩個位置的信息,記住destroyfetchupdatesave方法只是快捷方式AJAX調用者。所以,你可以添加all jQuery ajax parameters這些方法是這樣的:

// Remove the goal update view from the DOM 
removeItem: function() 
{ 
    this.model.destroy({ 
     wait: true, 
     success: function() 
     { 
      console.log("success"); 
     }, 
     error: function() 
     { 
      console.log("error"); 
     }, 
     data: 
     { 
      username: window.app.settings.credentials.username, 
      api_key: window.app.settings.credentials.api_key 
     } 
    }); 
} 

重寫jQuery的AJAX方法

根據您的需求,這可能是更好的實現(注意,這是沒有生產代碼,您可能需要修改這個以滿足您的需求,並在使用之前測試這個)

(function ($) { 
    var _ajax = $.ajax; 
    $.extend(
    { 
     ajax: function (options) 
     { 
      var data = options.data || {}; 
      data = _.defaults(data, { 
       username: window.app.settings.credentials.username, 
       api_key: window.app.settings.credentials.api_key 
      }); 
      options.data = data; 
      return _ajax.call(this, options); 
     } 
    }); 
})(jQuery); 
+0

我建議再多一個選項:使用'$ .ajaxPrefilter'(http://api.jquery.com/jQuery.ajaxPrefilter/)來獲得類似於重載jQuery的'$ .ajax'的效果,而無需必須實際覆蓋任何東西。 – machineghost

相關問題