当您调用 .destroy()、.fetch() 或 .save() 时,它们都调用 Model.sync,而后者仅调用 Backbone.sync。这是一个代理功能。这旨在为修改单个模型或从该模型扩展的任何模型的 AJAX 行为提供一个很好的钩子。
- 解决方案 1:覆盖 Global Backbone.sync
JSON.stringify
并修改contentType
当您指定要与删除请求一起发送的数据时。
- 优点:您可以调用
model.destroy()
并可选择传入options
参数
- 解决方案 2 - 覆盖 Model.sync 方法。
- 优点:覆盖仅影响单个模型。孤立的变化。
- 缺点:所有希望删除数据的模型都需要从正确的“基础模型”扩展
- 解决方案 3 - 不要覆盖任何东西,并使用所有的东西显式调用
stringify
model.sync contentType
。
- 优点:非常孤立的变化,不会影响任何其他模型。如果您要与大型代码库集成,这很有用。
脚本版本
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 */
}
});
覆盖
// 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 */
}
});
如果使用您的销毁请求发送数据是一个孤立的事情,那么这是一个足够的解决方案。
当调用model.destroy()
传递data
和contentType
选项时,如下所示:
javascript 版本/用法
var additionalData = { collective_id: 14 };
model.destroy({
data: JSON.stringify(additionalData),
contentType: 'application/json'
});
“问题”(使用 Backbone,而不是解决方案):
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));
}
在他们假定的 RESTful API 调用中,唯一需要的数据是应该附加到urlRoot
属性的 ID。
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