在与服务器同步之前是否存在等效的解析?

时间:2013-05-24 17:19:07

标签: backbone.js

在我的骨干模型中,我解析了服务器的响应:

var MyModel = Backbone.Model.extend({
    urlRoot: "/users",
    parse: function(response){
        var data = {};
        data.id = reponse.userDetails.id;
        data.name = response.userDetails.firstname + " " + response.userDetails.lastname;
        data.description = response.userDetails.description;

        return data;
    }
});

var myModel = new MyModel({id: 1});
myModel.fetch();

使用此模型的视图可以操作它,例如,如果用户单击视图以“选择”它,它将更新模型...

myModel.set({selected: true});

...视图将根据模型的更改事件重新渲染,并突出显示“已选择”的用户。

当需要将模型保存到服务器时,如何仅发送服务器所需的属性?并忽略通过用户交互添加的属性。

OR

数据模型是否应始终反映服务器返回的内容?如果是这样,是否有更好的方式来存储用户交互(视图是否“选中”)?它应该是一个单独的模型而不是实际的数据模型吗?

由于

2 个答案:

答案 0 :(得分:5)

如果对您的应用程序没有意义,则模型不需要镜像服务器上的数据。

对于模型的属性,如果您不需要在模板中呈现这些属性,则只需覆盖model.toJSON()以仅序列化要发送到服务器的属性。但请注意,在这种情况下,如果您使用this.model.toJSON()渲染模板(或其他任何内容),那么它也会受到影响。如果这是一个问题,那么您可以覆盖model.sync(),并在将其发送到Backbone.sync之前操纵传入的数据。例如:

var myModel = Backbone.Model.extend({
  sync: function (method, model, options) {
    // remove the unwanted attributes. Something like...
    options.attrs = _.pick(model.attributes, 'attribute1', 'attribute2', 'attribute3');
    return Backbone.sync.call(this, method, model, options);
  }
});

答案 1 :(得分:0)

按照mu_is_too_short的建议覆盖model.toJSON对我来说很有效。

在模型中

function() {
    var json = Backbone.Model.prototype.toJSON.call(this);
    json.ExtendedFieldData = JSON.stringify(json.ExtendedFieldData);
    return json;
},

我们将model.attributes用于模板。