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

145

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

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

Picardo
источник
4
В отсутствие группы Google попробуйте проверить комнату #documentcloud на freenode и задать свой вопрос там. Просто обязательно вернитесь сюда и ответьте на свой вопрос, если получите ответ. Там много хороших дискуссий, и приятно кодифицировать их и сделать их доступными для поиска тех, кто придет за вами.
Эндрю Де Андраде
3
К вашему сведению: groups.google.com/group/backbonejs
Дрю Дара-Абрамс

Ответы:

225

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

магистральная-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является (this.sync || Backbone.sync)действительным, так что вам просто нужно сделать что-то вроде:

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

    "sync": myOwnSpecificSync,

    ...
});

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

Raynos
источник
2
Что делать, если я хочу, чтобы модель извлекалась из localStorage, а другая - из сервера? Это возможно еще?
Пикардо
19
(this.sync || Backbone.sync)Смотрите редактировать. Еще один совет - прочитать аннотированный источник основы. Это все там!
Рэйнос
3
Детали после [Edit] о каждой модели, имеющей собственную синхронизацию, очень важны! Спасибо!
Авель
26
+1 за упоминание того факта, что вы можете переопределить метод синхронизации конкретной модели.
Четан
12
Только одно дополнение: если вы хотите вызвать «default» syncиз любого места в вашем коде (обычно переопределенное sync), просто сделайте a Backbone.sync.call(this, method, this, options).
асимметричный
15

Я знаю, что этот ответ немного запоздал, и ответ от @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);
};
Кирилл Н.
источник
11

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

sync: function (method, model, options) {
  options.data = _.pick(this.attributes, 'foo', 'bar', 'baz');
  return Backbone.sync.call(this, method, model, options);
}
Джесси Аткинсон
источник
и это входит в модель или коллекцию.
Гейб Рейнбоу
3
Незначительное предложение: как насчет изменения этой последней строки Backbone.sync.apply(this, arguments);? Это немного более гибко, если вы, например, решите опустить аргумент «options» в переопределенной версии sync.
Лохлан
Что-то еще для будущих искателей этого вопроса: обязательно верните Backbone.sync a la backbonejs.org/docs/backbone.html#section-62
Lochlan
1
Вы можете использовать Backbone.model.save(attributes, {patch: true})для частичного обновления сейчас
roborourke