Backbone Collection.create() 任意参数

Backbone Collection.create() with arbitrary parameters

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

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

示例:

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

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

所以...

POST api/adder 1, 2, 3

返回 JSON:

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

更新:

也许这个,不太极端的例子会有所帮助。 除了模型的 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 属性 仅将您想要持久保存的属性发送到服务器。