在我的骨干模型中,我解析了服务器的响应:
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
数据模型是否应始终反映服务器返回的内容?如果是这样,是否有更好的方式来存储用户交互(视图是否“选中”)?它应该是一个单独的模型而不是实际的数据模型吗?
由于
答案 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
用于模板。