model.save()的Backbone.js/express.js参数

Pet*_*rov 6 node.js express backbone.js

我在客户端上使用Backbone.js,在后端使用node.js,我在执行'有限'模型保存时遇到了一些麻烦,如下所述:http://backbonejs.org/#Model-保存

如在示例中,如果我这样做

book.save({author: "Teddy"});
Run Code Online (Sandbox Code Playgroud)

如何使用express.js访问save的参数,即我只想保存到'author'字段?我尝试了以下内容

req.body -> gives ALL parameters of the model being saved, I want only the 'author' field
req.query -> empty
Run Code Online (Sandbox Code Playgroud)

任何帮助非常感谢!

nik*_*shr 12

Model.save文档中所述:

save model.save([attributes],[options])
[...]属性hash(如set中所示)应该包含您想要更改的属性 - 未提及的键不会被更改 - 但是,资源完整表示将被发送到服务器.

但是,您可以覆盖save方法,并data通过将发送到服务器而不是完整模型表示的选项提供属性.例如,这只会保存传递给方法的属性:

var M = Backbone.Model.extend({   
    save: function (attrs, options) {
        options || (options = {});

        options.contentType = 'application/json';
        options.data = JSON.stringify(attrs);

        Backbone.Model.prototype.save.call(this, attrs, options);
    }
});
Run Code Online (Sandbox Code Playgroud)

还有一个小提琴http://jsfiddle.net/dLFgD/


正如@mikebridge在评论中指出的那样,现在可以通过传递一个attrs选项来获得此行为.所以要么使用

book.save(null, {
    attrs: {author: "Teddy"}
});
Run Code Online (Sandbox Code Playgroud)

或保持覆盖

var M = Backbone.Model.extend({
    url: '/echo/json/',

    save: function(attrs, options) {
        options || (options = {});      
        options.attrs = attrs;
        Backbone.Model.prototype.save.call(this, attrs, options);
    }
});
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/nikoshr/dLFgD/7/


如果您正在使用支持它的Backbone版本(> = 0.9.9)并且您的服务器理解该动词,您也可以发送PATCH请求,如@ pkyeck的回答中所述

  • 我想你现在可以通过用一行替换设置`options.contentType = ...`和`options.data = ...`的行来完成这个:`options.attr = attrs`.此值在Backbone.sync中使用,它隐式地处理内容类型. (2认同)