Вопрос по javascript – Как переопределить Backbone.sync, чтобы в конце он добавил apikey и имя пользователя?

3

Я использую «позвоночник-вкусный пирог», но мне тяжело, чтобы он работал правильно. В Tastypie я использую ApiKeyAuthentication для своих ресурсов, поэтому при каждом запросе ajax мне нужно добавлять apikey и имя пользователя в конец запроса или отправлять дополнительные заголовки, которые добавляют имя пользователя и ключ api.

Я пытаюсь удалить представление и его модель, используя магистраль со следующим кодом:

// 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 по следующему URL:

:8000/api/v1/update/2/

Он не включает в себя api_key или username в конце, и у него есть завершающий слеш в конце URL. Я думаю, что он пытается использовать Backbone.oldSync для выполнения запроса GET. Как бы я сделал так, чтобы синхронизация включала в себя ключ имени пользователя / API в конце и удаляла косую черту?

Во всех остальных запросах я сделал так, чтобы ключ api и имя пользователя добавлялись в конец запроса http, добавив следующий код в backbone-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,
    });
}
возможный дубликатHow to override Backbone.sync? Ben

Ваш Ответ

2   ответа
0

Только для будущих читателей этого поста, когда вы делаете model.destroy (), вы не можете передавать любые данные, потому что у запроса на удаление нет тела, см. Эту проблему для получения дополнительной информации: https://github.com/documentcloud/backbone/issues/789

17

Давайте рассмотрим возможности

Using headers

Backbone.sync по-прежнему просто использует jQuery ajax, поэтому вы можете переопределить 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);
});

Using Ajax Options

Если вам нужно отправить информацию только в одном или двух местах, помните, чтоdestroy, fetch, update а такжеsave Методы - это просто ярлыки для вызывающего Ajax. Так что вы можете добавитьвсе параметры jQuery ajax к этим методам как таковым:

// 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
        }
    });
}

Overriding jQuery's ajax method

В зависимости от ваших потребностей, это может быть лучшей реализацией (обратите внимание, что это не рабочий код, вам может потребоваться изменить его в соответствии со своими потребностями и протестировать его перед использованием)

(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);
Я предлагаю еще один вариант: использовать$.ajaxPrefilter (api.jquery.com/jQuery.ajaxPrefilter) получить эффект, аналогичный переопределению jQuery$.ajax без необходимости что-либо переопределять.

Похожие вопросы