我有一个相当通用的模型和该模型的集合(见下文),我正在将其作为一系列视图的基础。在几个视图上,选择其中一个模型会生成操作(通过“selected”属性),并且我需要能够仅在客户端跟踪选择。
然而,在 Backbone 中似乎没有干净的方法来做到这一点。在客户端上的模型上添加/更改的任何属性都将同步到服务器。我不能使用{silent : yes}
更改该属性时,因为我需要在视图中触发更改change
事件在该属性上触发。我想出的唯一方法是覆盖save
功能于Backbone.Model
我的问题:有没有一种方法可以拥有我所缺少的仅限客户端的属性,或者我的方法是否在我没有看到的其他方面存在结构缺陷?
var CSEvent = Backbone.Model.extend({
idAttribute: "_id",
urlRoot : '/api/events',
defaults: {
title : "",
type : "Native",
repeatOrOneTime : "OneTime",
selected : false
}
});
var CSEventCollection = Backbone.Collection.extend({
model: CSEvent,
url: '/api/events',
getSelectedEvent : function() {
return this.find(function(csevent) { return csevent.get('selected') === true; });
},
selectEvent : function(eventId) {
this.deselectEvent();
this.get(eventId).set({selected : true});
},
deselectEvent : function() {
this.getSelectedEvent().set({selected : false});
}
});
尝试覆盖Model.toJSON()
方法,正如您在骨干模型代码 https://github.com/documentcloud/backbone/blob/master/backbone.js#L227-229这个方法并不是很复杂。官方文档还建议在特殊需要时覆盖它。
尝试这样的事情:
var CSEvent = Backbone.Model.extend({
toJSON: function(){
return _.clone( _.pick( this.attributes, "title", "type", "repeatOrOneTime" ) );
}
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)