具有任意参数的Backbone Collection.create()

Backbone Collection.create() with arbitrary parameters

本文关键字:Collection create Backbone 任意 参数      更新时间:2023-10-14

我正在使用具有RESTful持久性的Backbone。

是否可以为Backbone Collection create()方法定义一些任意输入参数?通常,Backbone期望相应的模型作为输入参数。

示例:

模型"Adder"具有以下属性:"id"、"date"answers"sum"

我想通过传递3个参数来创建这些模型的一个实例(通过相应的collections的create()方法):a,b,c。然后,Backend将计算sum=a+b+c,并用计算出的sum创建一个记录。它应该返回一个有效的Model对象并将其添加到集合中。

所以。。。

POST api/adder 1, 2, 3

重新发布的JSON:

{
    "id": 153235,
    "date": "11/11/11",
    "sum": 6
}

更新:

也许这个不那么极端的eample会有所帮助。除了模型的atts之外,我如何向POST方法发送额外的参数?

如果模型是:

{
   a: 1,
   b: 2,
   c:3
}

我想再发送一个参数,比如calculation_mode,它在模型中不存在。

我能做到吗?

在我看来,您的问题是需要在客户端存储和更改计算参数,而这些参数不一定要通过POSTPUT请求发送到服务器。从本质上讲,您希望保存/创建模型属性的子集。

对于这种情况,一个好的模式是在模型中定义一个serverAttrs属性——一个表示要持久保存到服务器的属性的属性哈希。

然后,您可以在模型中或模型扩展的基础模型中覆盖Backbone的save方法(更好的方法)。

var MyModel = Backbone.Model.extend({
    idAttribute: 'id',
    serverAttrs: [
        'id',
        'label',
        'fullName',
    ],
    defaults: {
        label: 'My Default Label',
        fullName: '',
        firstName: 'John',
        lastName: 'Smith'
    },
    initialize: function(options){
        this.updateFullName();
        this.on('change:firstName change:lastName', this.updateFullName);
    },
    updateFullName: function(){
        this.set('fullName', this.get('firstName') + ' ' + this.get('lastName'));
    },
    save: function(attrs, options) {
        attrs = attrs || this.toJSON();
        options = options || {};
        if (this.serverAttrs) {
            attrs = _.pick(attrs, this.serverAttrs);
        }
        return Backbone.Model.prototype.save.call(this, attrs, options);
    }
});

在我们的保存方法中,我们检查serverAttrs属性的存在,如果它存在,我们只提取这些属性并将它们持久化到服务器。

因此,总之,您可以在模型中存储您想要的任何属性(在合理的范围内),然后通过定义serverAttrs属性,只将您想要持久化的属性发送到服务器。