Как заменить Backbone.sync ни на что, даже на localStorage?

#javascript #backbone.js #local-storage #spine.js

#javascript #backbone.js #локальное хранилище #spine.js

Вопрос:

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

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

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

Комментарии:

1. просто, не используйте backbone и переключитесь на простой кроссбраузерный обработчик Ajax.

Ответ №1:

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

Коллекции:

  • выборка
  • Создать

Модели:

  • выборка
  • Сохранить
  • уничтожить

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

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

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

Комментарии:

1. Спасибо. это имеет смысл. в боковой заметке, если вы не используете Model.destroy(), как вы правильно что-то «уничтожаете»? Использовать collection.remove и привязать к событию удаления?

2. да, это сделало бы это. отмените ссылку на модель везде, где есть ссылка, и она будет собрана мусором.

Ответ №2:

Однажды я изложил эту суть как часть руководства по 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);
};
  

Комментарии:

1. Я думаю, что API изменился с тех пор, как вы написали это, потому что третий аргумент не является обратным вызовом. Я просто return false и, кажется, все работает нормально. Но вы упоминаете «различные нежелательные последствия» — что бы это было, если бы все мои данные были на стороне клиента, без необходимости сохранения?