有没有办法从我的模型排除某些属性,当我同步?
例如,我请的一些视图状态我的模型信息。 比方说,我有一个选择器模块该模块只需拨动一个selected
对我的模型属性。 后来,当我打电话.save()
在我的收藏,我愿意忽略的价值selected
和同步到服务器中排除。
是否有这样做的一个干净的方式?
( 让我知道如果你想了解更多详细信息 )
有没有办法从我的模型排除某些属性,当我同步?
例如,我请的一些视图状态我的模型信息。 比方说,我有一个选择器模块该模块只需拨动一个selected
对我的模型属性。 后来,当我打电话.save()
在我的收藏,我愿意忽略的价值selected
和同步到服务器中排除。
是否有这样做的一个干净的方式?
( 让我知道如果你想了解更多详细信息 )
这似乎是最好的解决方案(基于@nikoshr引用的问题)
Backbone.Model.extend({
// Overwrite save function
save: function(attrs, options) {
options || (options = {});
attrs || (attrs = _.clone(this.attributes));
// Filter the data to send to the server
delete attrs.selected;
delete attrs.dontSync;
options.data = JSON.stringify(attrs);
// Proxy the call to the original save function
return Backbone.Model.prototype.save.call(this, attrs, options);
}
});
因此,我们覆盖节省模型实例功能,但我们过滤掉我们不需要的数据,然后我们代理对父的原型功能。
在下划线1.3.3他们增加了选秀 ,并在1.4.0他们增加了省略 ,可以非常简单地用于覆盖模型的toJSON
到白名单与属性功能_.pick
或黑名单属性_.omit
。
而且,由于toJSON
是为数据传输到服务器所使用的sync命令我觉得这是一个很好的解决方案,只要你不希望这些领域的其他任何地方使用toJSON
。
Backbone.Model.extend({
blacklist: ['selected',],
toJSON: function(options) {
return _.omit(this.attributes, this.blacklist);
},
});
我的解决方案结合上述所有。 只需使用白名单,而不是黑的..这是总体上是好的规则
限定
attrWhiteList:['id','biography','status'],
然后覆盖保存
save: function(attrs, options) {
options || (options = {});
//here is whitelist or all
if (this.attrWhiteList != null )
// Filter the data to send to the server
whitelisted = _.pick(this.attributes, this.attrWhiteList);
else
whitelisted =this.attributes;
/* it seems that if you override save you lose some headers and the ajax call changes*/
// get data
options.data = JSON.stringify(whitelisted);
if ((this.get('id') == 0) || (this.get('id') == null))
options.type = "POST"
else
options.type = "PUT";
options.contentType = "application/json";
// options.headers = {
// 'Accept': 'application/json',
// 'Content-Type': 'application/json'
// },
// Proxy the call to the original save function
return Backbone.Model.prototype.save.call(this, attrs, options);
},
事实上,有实现这一目标的一个更简单的方法没有与骨干保存或同步功能搞乱,因为你会不会在期待这种行为是永久性的
如果你看一下Backbone.js的线1145,你会看到
// Ensure that we have the appropriate request data.
if (options.data == null && model && (method === 'create' || method === 'update' || method === 'patch')) {
params.contentType = 'application/json';
params.data = JSON.stringify(options.attrs || model.toJSON(options));
}
这意味着您可以通过将数据在你的选择覆盖XHR的数据部分
由于骨干保存需要model.save([属性],[选项])
但请记住,例如像id属性可能是适当的节省至关重要
例
model.save( {}, { data: JSON.stringify(data) } ) ;
所以,你应该做这样的事情
var data = { id : model.id , otherAttributes : 'value' } ;
model.save( {}, { data : JSON.stringify(data) } );
该做的伎俩相当不错的我,还可能与XHR任何骨干网,如获取,保存,删除,使用...
基于几个问题的答案,这占空物体的情况下,并在不发出的骨干有条件contentType
如果options.data
已经设置:
EDITABLE_ATTRIBUTES = ["name", "birthdate", "favoriteFood"];
...
save: function(attrs, options) {
// `options` is an optional argument but is always needed here
options || (options = {});
var allAttrs = _.extend({}, this.attributes, attrs);
var allowedAttrs = _.pick(allAttrs, EDITABLE_ATTRIBUTES);
// If `options.data` is set, Backbone does not attempt to infer the content
// type and leaves it null. Set it explicitly as `application/json`.
options.contentType = "application/json";
options.data = JSON.stringify(allowedAttrs);
return Backbone.Model.prototype.save.call(
this, allowedAttrs, options);
},
由于save
使用toJSON
我们覆盖它:
toJSON: function(options) {
var attr = _.clone(this.attributes);
delete attr.selected;
return attr;
},
但是,如果你正在使用的toJSON并且需要其可能无法正常selected
在视图中的例子。 否则,你可能需要重写save
方法。
集options.attrs将允许您自定义的API PARAM:
var model = new Backbone.Model();
model.save(null, {
wait: true,
success: function() {
},
attrs: _.omit(model.attributes, 'selected')
});
我发现了一些问题,接受的解决方案,如options.data修改骨干的方式进行调用。 更好的使用options.attrs就象这样:
Backbone.Model.extend({
save: function (attrs, options) {
options = options || {};
attrs = _.extend({}, _.clone(this.attributes), attrs);
// Filter the data to send to the server
delete attrs.selected;
options.attrs = attrs;
// Proxy the call to the original save function
return Backbone.Model.prototype.save.call(this, attrs, options);
}
});
如果是偶一为之,你可以使用mode.unset('selected', { silent:true })
沉默只能设置为避免解雇change事件),要移除的属性...这有没有节能虽历经不必这么漂亮的反效果重新进行设置。
这就是说,我完全同意上述解决方案之一。 此外,如果这是你需要更经常地的东西。
只设定期望的值,可使用HTTP POST的HTTP PATCH INSEAD。 在骨架上,只需添加一个补丁属性保存方法:
entity.save(data,{patch:true})
使用保存该属性,只通过字段data
被发送到服务器。
有了这个同样的问题,我决定创建一个小模块,可以帮助: https://github.com/lupugabriel1/backbone-model-save
这是你如何在你的模型使用它:
var myModel = new Backbone.ModelSave.extend({
notSync: ['name', 'age']
});