Как переопределить Backbone.sync?

Я пытаюсь использовать Backbone.js, и одна из вещей, которую я пытаюсь сделать, - сделать вызов удаленного API, поэтому мне нужно переопределить Backbone.sync, поскольку я понимаю документация.

Нет примера, как это сделать в самой документации, и, похоже, не существует группы google для Backbone... может ли кто-нибудь указать пример для этого?

Ответ 1

Взгляните на этот аннотированный пример источника, где они перезаписывают Backbone.sync альтернативой localstorage

backbone-localStorage

В основном Backbone.sync должна быть функцией, которая принимает 4 аргумента:

Backbone.sync = function(method, model, options) { };

Вам нужно запустить либо options.success, либо options.error в зависимости от того, удалось ли выполнить method. Методы находятся в формате:

  • "create": ожидается, что вы создадите модель на сервере
  • "read": ожидается, что вы прочитаете эту модель с сервера и вернете ее
  • "update": ожидается, что вы обновите модель на сервере аргументом
  • "delete": ожидается, что вы удалите модель с сервера.

Вам нужно реализовать эти 4 метода и определить, что вы хотите для своего "server"

Конечно, это только те вещи, которые Backbone.sync должен реализовать. Вы можете реализовать больше methods, и вы можете передать больше параметров обратно на success, но лучше не делать этого.

Лучше всего убедиться, что он делает то же самое, что и Backbone.sync в настоящее время, так что ваше программирование на интерфейс, а не на реализацию. Если вы хотите отключить свой измененный Backbone.sync, например, localStorage, вам не придется расширять его самостоятельно, чтобы он соответствовал вашему расширенному Backbone.sync "

[изменить]

Также обратите внимание, что вы можете использовать несколько реализаций sync. Каждая ссылка на Backbone.sync является actaully (this.sync || Backbone.sync), поэтому вам просто нужно сделать что-то вроде:

var MyModel = Backbone.Model.extend({ 
    ...

    "sync": myOwnSpecificSync,

    ...
});

Backbone.sync - это только глобальная по умолчанию, используемая всеми моделями, если только у моделей не установлен метод sync.

Ответ 2

Я знаю, что этот ответ слишком поздно, и ответ от @Raynos велик, но я сделал это немного по-другому, и, возможно, это было бы полезно для вас или для любого другого человека, пытающегося использовать API с Backbone.

Вместо того, чтобы переопределять Backbone.sync, я переопределил Backbone.ajax, потому что там, где выполняется запрос ajax.

Вот пример:

// Set the default implementation of `Backbone.ajax` to proxy through to `$`.
Backbone.ajax = function() {
    var args = Array.prototype.slice.call(arguments, 0);

    // Here, I add the OAuth token (or any other token)
    // But before, I check that data exists, if not I add it
    if (args[0]['data'] === undefined) {
        args[0]['data'] = {};
    }
    args[0]['data']['token'] = 'any_api_token_here';

    return Backbone.$.ajax.apply(Backbone.$, args);
};

Ответ 3

Мне обычно необходимо переопределить метод магистральной sync, когда мне нужно только синхронизировать определенные атрибуты. Типичная реализация выглядит следующим образом:

sync: function (method, model, options) {
  options.data = _.pick(this.attributes, 'foo', 'bar', 'baz');
  return Backbone.sync.call(this, method, model, options);
}