老实说,我试图覆盖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 param 传递给服务器.但即使它在sync()的选项哈希中,我克隆它,它也不会进入服务器! 如何将额外的参数发送到服务器?
(实际上,到达服务器的唯一东西是Model的id)
提前致谢!
当你调用.destroy(),.find()或.save()时,它们都调用只调用Backbone.sync的Model.sync.这是一个代理功能.这旨在为修改单个模型或从该模型扩展的任何模型的AJAX行为提供一个很好的钩子.
解决方案1:覆盖Global Backbone.sync JSON.stringify
并修改contentType
指定要与删除请求一起发送的数据的时间.
优点:您可以调用model.destroy()
并可选地传入options
参数
解决方案2 - 覆盖Model.sync方法.
优点:覆盖仅影响单个模型.孤立的变化.
缺点:所有希望删除数据的模型都需要从正确的"基础模型"扩展
解决方案3 -不要覆盖任何东西,显式调用model.sync所有的stringify
和contentType
东西.
优点:非常孤立的变化,不会影响任何其他模型.如果您正在与大型代码库集成,则非常有用.
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假设(查看源代码)删除请求没有数据有效负载.
// 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