我想使用Backbone.save模型,模型的嵌套数据需要过滤,所以我用
model.save(null,{
success: ...,
error:...,
data: {
id:null,
name:'myname',
nestmodel: {
id:'xx'/*Other data i don't need it,so just id column*/
}
}
}
我不想使用patch
HTTP METHOD。因为我只是添加了一个新模型,而不是更改零件数据。
而且我不想发布一些nestmodel
数据,因为它很大而且我只是希望ID正常。
nestmodel
只需要id。
我在model.save()
有办法解决这个问题。
这是我的整个代码:
sync: function(method, model, options) {
var data, orderSuiteItems;
if (method === 'create') {
options.url = this.url;
} else {
// MUST setting the url .options's url is undefined
options.url = this.url + this.idUrl(this.get('id'));
}
// IF `create` or `update` , pick the we need properties
if (method === 'create' || method === 'update') {
orderSuiteItems = [];
if (this.has('orderSuiteItems')) {
// Because the `dishes` and `dishesUnitPrice` have a lot of prop,
// Each of `dishes` or `dishesUnitPrice` may each have 10K data
orderSuiteItems = _.map(this.get('orderSuiteItems'), function(osi) {
return {
id: osi.id,
qty: osi.qty,
servingQty: osi.qty,
confirmQty: osi.confirmQty,
deleted: osi.deleted,
orderItem: _.pick(osi.orderItem, 'id'),
dishes: _.pick(osi.dishes, 'id'), // HAVE a large prop
dishesUnitPrice: _.pick(osi.dishesUnitPrice, 'id'), // HAVE a large prop
orderItemStatus: osi.orderItemStatus,
piece: osi.piece
};
});
}
data = {
id: this.get('id'),
order: this.get('order'),
price: this.get('price'),
dishes: _.pick(this.get('dishes'), 'id', 'isSuite'),
dishesUnitPrice: _.pick(this.get('dishesUnitPrice'), 'id'),
qty: this.get('qty'),
servingQty: this.get('servingQty'),
confirmQty: this.get('confirmQty'),
sum: this.get('sum'),
orderSuiteItems: orderSuiteItems,
orderItemStatus: this.get('orderItemStatus')
};
// Setting attrs with pick data.
options.attrs = data;
return Backbone.sync(method, model, options);
} else {
return Backbone.sync(method, model, options);
}
}
答案 0 :(得分:-1)
我希望您只是为了示例清晰而放置data
选项。
无论如何,在使用unset
之前如何使用Model#save
删除您的属性?之后重新设置它
另一种解决方案是覆盖Model#save
方法
您也可以 shadow 将相同的方法定义为属性而不是原型(这样可以让您切换回来)。
解决方案#1或类似的东西将是最简单的。解决方案#2可能更多,比方说,风险更大,但可能更少的样板。我会在一些非常特殊的情况下使用#3(甚至不能考虑现在的情况),其中包括:对象是单例(因为我们没有使用原型)(或者仅限于有限数量) ,需要切换2种模式,最好只有1种方法。
修改强>
解决方案#1:
var nestedModel = myModel.get('nestmodel');
myModel.save('nestmodel', nestedModel.id, {silent: true});
myModel.set('nestmodel', nestedModel, {silent: true});
我添加了silent
标记,因为我不知道您是否正在收听nestmodel
属性的更改。如果这个解决方案不合适,我会为其他解决方案添加代码。