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

时间:2015-02-13 14:18:12

标签: javascript backbone.js

我正在使用Backbone和RESTful持久性。

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

示例:

模型“Adder”具有以下属性:“id”,“date”和“sum”

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

因此...

POST api/adder 1, 2, 3

Retured JSON:

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

更新

这种不太极端的例子可能会有所帮助。 如何将其他参数发送到POST方法,而不是模型的atts?

如果模型是:

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

我想发送一个更多的参数,比如compute_mode,它在模型本身中不存在。

我能这样做吗?

1 个答案:

答案 0 :(得分:0)

听起来我的问题是,您需要在客户端存储和更改的计算参数,而这些参数不一定要通过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);
    }

});

在我们的save方法中,我们检查是否存在serverAttrs属性,如果它存在,我们只选择那些属性并将它们保存到服务器。

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