#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
и, кажется, все работает нормально. Но вы упоминаете «различные нежелательные последствия» — что бы это было, если бы все мои данные были на стороне клиента, без необходимости сохранения?