Как заменить Backbone.sync ни на что, даже на localStorage? - PullRequest
8 голосов
/ 13 октября 2011

Как заменить Backbone.sync, чтобы ничего не делать? В моем приложении есть кнопка «Отправить», которая выполняет для меня AJAX POST, поэтому я не хочу использовать автоматическое поведение по умолчанию, которое обеспечивает Backbone.sync.

Я также не хочу использовать адаптер Backbone LocalStorage, поскольку я пытаюсь сделать этот сайт совместимым с IE6 и 7.

При этом я просто хочу, чтобы Backbone ничего не делал, кроме как сохранял записи в памяти JS (аналог Spine.js). Это вообще возможно?

Ответы [ 2 ]

19 голосов
/ 13 октября 2011

Самый простой и, вероятно, лучший способ сделать это - не заменить Backbone.Sync, а просто проигнорировать его.Вот методы, которые вы не хотите вызывать:

Коллекции:

  • fetch
  • create

Модели:

  • выборка
  • сохранение
  • уничтожение

Если вы избегаете вызова любого из этих методов, вы эффективно игнорируете Backbone.Sync и сможетенаписать свой собственный код для выполнения ваших вызовов AJAX.

Я написал много кода Backbone, даже не обращаясь к вызову сервера, когда я начинал.Нет правил, чтобы сказать, что вы должны использовать все возможности Backbone.На самом деле, я бы сказал, что все наоборот.Магистраль написана так модульно, так что каждая область функциональности и специализации так хорошо отделена, что вы должны использовать только то, что вам действительно нужно.

Создайте свои модели в памяти, позвоните им set и get, чтобы сохранить данные.Заполните их в коллекции с add и remove по мере необходимости.Передайте ваши модели и коллекции вашим представлениям и представьте их в HTML DOM.Просто не вызывайте методы, перечисленные выше, и вам не придется беспокоиться о Backbone.Sync.

1 голос
/ 13 октября 2011

Я однажды сделал эту суть как часть учебника по Backbone.js.Он подделывает Backbone.sync, только записывая в журнал, но чтобы придать ему видимость реализма, он также копирует атрибут .cid модели в атрибут .id, чтобы модели выглядели синхронизированными.Остерегайтесь различных нежелательных последствий использования этой техники в производстве!Но мы все здесь взрослые по соглашению, верно?

Вот та же идея без регистрации:

Backbone.sync = function(method, model, succeeded) {
    if(typeof model.cid != 'undefined') {
        // It's a freshly made model
        var cid = model.cid;
        // ..fake that it's .cid turns into a "real" .id:
        model.unset('cid').set({id:cid}, {silent:true});
    }
    // Oh yes, it all went sooo well ;-)
    succeeded(model);
};
...