Як перекрити Backbone.sync?


145

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

Немає прикладу того, як це зробити в самій документації, і, здається, не існує групи google для Backbone ... чи може хтось вказати приклад для цього?


4
У разі відсутності групи Google спробуйте перевірити номер #documentcloud на фрінеоді та задайте там своє запитання. Просто не забудьте повернутися сюди і відповісти на власне запитання, якщо отримаєте відповідь. Там багато чудових дискусій, і приємно це кодифікувати та зробити його пошуком для тих, хто йде за вами.
Ендрю Де Андраде

Відповіді:


225

Погляньте на цей примітка з примітками, де вони Backbone.syncзаміщені, з альтернативою локального зберігання

магістраль-локальний сховище

В основному 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для скажімо локальну сховище, вам не доведеться самостійно розширювати її, щоб відповідати розширеній Backbone.sync "

[Редагувати]

Також зауважте, що ви можете використовувати кілька реалізацій sync. Кожна посилання на Backbone.syncнього точно, (this.sync || Backbone.sync)тому вам просто потрібно зробити щось на кшталт:

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

    "sync": myOwnSpecificSync,

    ...
});

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


2
Що робити, якщо я хочу отримати модель з localStorage, а інша - із сервера? Це ще можливо?
пікардо

19
(this.sync || Backbone.sync)Див. Редагування. Подальша порада - прочитати анотоване джерело хребта. Це все є!
Райнос

3
Деталі після [Редагувати] про кожну модель, яка має власну синхронізацію, дуже важлива! Дякую!
Авель

26
+1 для згадки про те, що ви можете змінити метод синхронізації конкретної моделі.
Четан

12
Лише одне доповнення: якщо ви хочете зателефонувати "за замовчуванням" syncз будь-якого місця коду (як правило, перезарядження sync), просто зробіть 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);? Це дещо гнучкіше, якщо ви, наприклад, вирішите залишити аргумент "параметри" в перекритій версії sync.
Лохлан

Щось ще для майбутніх шукачів цього питання: обов’язково поверніть Backbone.sync a la backbonejs.org/docs/backbone.html#section-62
Lochlan

1
Ви можете використовувати Backbone.model.save(attributes, {patch: true})часткові оновлення зараз
roborourke
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.