说实话,我一直试图覆盖Backbone的一个Model的sync()方法,我已经有了该函数的签名,并且它被正确触发,但我不知道该怎么做放入函数体,以便默认调用DELETE,但使用额外的参数。 即
class Master.Models.Member extends Backbone.Model
urlRoot: '/api/members/'
sync: (method, model, options) ->
params = _.clone options
Backbone.sync method, model, params
我称之为:
......
remove: ->
@model.destroy
collective_id: the_id
我的目的是将您在那里看到的 collective_id 参数传递给服务器。但即使它在sync()的选项哈希中,我克隆它,它不会进入服务器! 如何将额外的参数发送到服务器?
(因为它是唯一到达服务器的是模型的id)
提前致谢!
答案 0 :(得分:42)
当你调用.destroy(),。fetch()或.save()时,它们都调用只调用Backbone.sync的Model.sync。它是一个代理功能。这旨在为修改单个模型或从该模型扩展的任何模型的AJAX行为提供一个很好的钩子。
JSON.stringify
,并在您指定要与删除请求一起发送的数据时修改contentType
。
model.destroy()
并可选择传递options
参数stringify
和contentType
内容显式调用model.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 */
}
});
替换强>
// 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.js假设(view source)删除请求不拥有数据有效负载。
// 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
答案 1 :(得分:4)
Params需要在options.data
中发送,请尝试:
的CoffeeScript
remove: () ->
@model.destroy
data: JSON.stringify
collective_id: the_id,
contentType: 'application/json'
的javascript
remove: function() {
return this.model.destroy({
data: JSON.stringify({
collective_id: the_id
}),
contentType: 'application/json'
});
}