当前位置:  开发笔记 > 编程语言 > 正文

在Model级别覆盖Backbone.sync()以发送额外的参数?

如何解决《在Model级别覆盖Backbone.sync()以发送额外的参数?》经验,为你挑选了1个好方法。

老实说,我试图覆盖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)

提前致谢!



1> Cory Daniels..:

当你调用.destroy(),.find()或.save()时,它们都调用只调用Backbone.sync的Model.sync.这是一个代理功能.这旨在为修改单个模型或从该模型扩展的任何模型的AJAX行为提供一个很好的钩子.

解决方案1:覆盖Global Backbone.sync JSON.stringify并修改contentType指定要与删除请求一起发送的数据的时间.

优点:您可以调用model.destroy()并可选地传入options参数

解决方案2 - 覆盖Model.sync方法.

优点:覆盖仅影响单个模型.孤立的变化.

缺点:所有希望删除数据的模型都需要从正确的"基础模型"扩展

解决方案3 -不要覆盖任何东西,显式调用model.sync所有的stringifycontentType东西.

优点:非常孤立的变化,不会影响任何其他模型.如果您正在与大型代码库集成,则非常有用.

[解决方案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()传入datacontentType选项时,如下所示:

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

推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有