Ответ 1
Когда вы вызываете .destroy(),.fetch() или .save(), все они вызывают Model.sync, который вызывает только Backbone.sync. Это прокси-функция. Это предназначено, чтобы обеспечить хороший крюк для изменения поведения AJAX одной модели или любых моделей, которые простираются от этой модели.
- Решение 1: переопределите Global Backbone.sync на
JSON.stringify
и изменитеcontentType
, когда вы указали данные, которые должны быть отправлены с запросом удаления.- Плюсы: вы можете вызвать
model.destroy()
и опционально передать параметрoptions
- Плюсы: вы можете вызвать
- Решение 2. Переопределите метод Model.sync.
- Плюсы: переопределение влияет только на отдельные модели. Изолированные изменения.
- Минусы: все модели, которые хотят удалить данные, должны быть расширены от правильной "базовой модели".
- Решение 3. Не переопределяйте ничего и явно вызывайте model.sync со всеми вещами
stringify
иcontentType
.- Плюсы: очень изолированные изменения, не повлияют на какие-либо другие модели. Полезно, если вы интегрируетесь с большой базой кода.
[Решение 1] - Глобальное переопределение Backbone.sync(это повлияет на все модели)
версия javacript
var oldBackboneSync = Backbone.sync;
Backbone.sync = function( method, model, options ) {
// delete request WITH data
if ( method === 'delete' && options.data ) {
options.data = JSON.stringify(options.data);
options.contentType = 'application/json';
} // else, business as usual.
return oldBackboneSync.apply(this, [method, model, options]);
}
Использование
var model, SomeModel = Backbone.Model.extend({ /* urlRoot, initialize, etc... */});
model = new SomeModel();
model.destroy({
data: {
/* data payload to send with delete request */
}
});
[Решение 2] - переопределить Backbone.destroy на базовой модели и расширить другие модели.
переопределить
// Create your own 'enhanced' model
Backbone.EnhancedModel = Backbone.Model.extend({
destroy: function( options ) {
if ( options.data ) {
// properly formats data for back-end to parse
options.data = JSON.stringify(options.data);
}
// transform all delete requests to application/json
options.contentType = 'application/json';
Backbone.Model.prototype.destroy.call(this, options);
}
});
Использование
var model, SomeModel = Backbone.EnhancedModel.extend({ /* urlRoot, initialize, etc... */})
model = new SomeModel();
SomeModel.destroy({
data: {
/* additional data payload */
}
});
[Решение 3] - Вызовите .destroy() с правильными параметрами.
Если отправка данных с вашими запросами на уничтожение является изолированной, то это адекватное решение.
При вызове model.destroy()
введите параметры data
и contentType
, например:
версия/использование javascript
var additionalData = { collective_id: 14 };
model.destroy({
data: JSON.stringify(additionalData),
contentType: 'application/json'
});
"Проблема" (с базой, а не с решениями):
Backbone.js делает предположение (просмотр источника), которое удаляет запросы не.
// delete methods are excluded from having their data processed and contentType altered.
if (options.data == null && model && (method === 'create' || method === 'update' || method === 'patch')) {
params.contentType = 'application/json';
params.data = JSON.stringify(options.attrs || model.toJSON(options));
}
В своем предполагаемом вызове API RESTful единственными требуемыми данными является идентификатор, который должен быть добавлен к свойству urlRoot
.
var BookModel = Backbone.Model.extend({
urlRoot: 'api/book'
});
var book1 = new BookModel({ id: 1 });
book1.destroy()
Запрос на удаление будет отправлен как
DELETE => api/book/1
contentType: Content-Type:application/x-www-form-urlencoded; charset=UTF-8