3

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

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});

...并且视图将根据模型的更改事件重新呈现并突出显示“选定”用户。

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

或者

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

谢谢

4

2 回答 2

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);
  }
});
于 2013-05-24T22:03:49.817 回答
0

mu_is_too_shortmodel.toJSON建议的覆盖对我来说效果很好。

在模型中

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

我们model.attributes用于模板。

于 2015-11-26T12:47:28.913 回答