Что именно происходит при сохранении модели Backbone?

Что именно происходит при сохранении модели Backbone? Здесь лучшее, что я могу объединить, прочитав документацию здесь:

  • model.save([attributes], [options]) называется
  • Событие "change" запускается (но только если атрибуты новы)
  • Сервер уведомляется об изменении?
  • Событие "sync" вызывается, как только сервер возвращает

Но я являюсь Backbone noob, и я уверен, что кто-то другой сможет лучше объяснить ситуацию.

Мне отчасти интересно, что происходит. У меня также возникли проблемы с пониманием того, как Backbone создает объект JSON, который он отправляет на сервер. У меня есть отдельная проблема, где объект JSON не тот, кем я его хочу, но я не знаю, как его изменить.

Ответ 1

Подробный процесс можно найти в аннотированный исходный код для Backbone.Model.save и Backbone.sync.

Если вы игнорируете options.wait и options.silent, ваша декомпозиция в основном правильная.

При выпуске model.save:

  • атрибуты, переданные функции, устанавливаются, событие изменения запускается, если значения изменены
  • save делегирует запрос model.sync или Backbone.sync
  • sync сериализует данные в строку JSON, вызывая JSON.stringify(model.toJSON())
  • Запрос Ajax отправляется на сервер, запрос POST для нового объекта, PUT для обновления. Целевой URL-адрес определяется model.url (или collection.url/id)
  • Когда запрос завершается, модель обновляется с ответом сервера, если таковой имеется, и запускает событие change соответственно.
  • Вызываются успешные или обратные вызовы ошибок, событие sync запускается, если не определена успешная обратная связь.

Обычно вы можете настроить это поведение, переопределяя model.toJSON или model.sync

Ответ 2

во-первых, я предлагаю вам прочитать исходный код магистрали, на самом деле очень просто. Поддержка магистральной и серверной сторон достигается с помощью backbone.sync.

second, Вы можете снова проследить debug model.save метод кода, естественно узнать подробности. Я предлагаю вам начать здесь: http://backbonejs.org/examples/todos/index.html