到目前为止,我已经有很好的骨干关系工作。我的关系和逆向关系已经建立得很好(见下文)。当我最初在我的Country
模型实例上调用.fetch()
时,nominees
数组完美地解析为nominee
模型。
当我稍后再次致电.fetch()
时,即使nominee
数据已更改(例如,投票计数已经增加),这些相关模型也不会更新。从本质上讲,骨干的.set()
方法似乎最初不了解关系,但后来不了。
国家模型
var Country = Backbone.RelationalModel.extend({
baseUrl : config.service.url + '/country',
url : function () {
return this.baseUrl;
},
relations : [
{
type : Backbone.HasMany,
key : 'nominees',
relatedModel : Nominee,
collectionType : Nominee_Collection,
reverseRelation : {
key : 'country',
includeInJSON : false
}
}
]
});
country.fetch()
{
"entrant_count" : 1234,
"vote_count" : 1234,
"nominees" : [
{
"id" : 3,
"name" : "John Doe",
"vote_count" : 1,
"user_can_vote" : true
},
{
"id" : 4,
"name" : "Marty McFly",
"vote_count" : 2,
"user_can_vote" : true
}
]
}
与往常一样,任何帮助将不胜感激。
因此,看来骨干相关专门会自动放弃关系(请参阅updateRelations
方法),然后简单地发出了您的模型可以针对的relational:change:nominees
事件。但是,如果您希望通过编程方式更新相关的模型,只需修改updateRelations
方法如下:
Backbone.RelationalModel.prototype.updateRelations = function( options ) {
if ( this._isInitialized && !this.isLocked() ) {
_.each( this._relations || [], function( rel ) {
// Update from data in `rel.keySource` if set, or `rel.key` otherwise
var val = this.attributes[ rel.keySource ] || this.attributes[ rel.key ];
if ( rel.related !== val ) {
this.trigger( 'relational:change:' + rel.key, this, val, options || {} );
// automatically update related models
_.each(val, function (data) {
var model = rel.related.get(data.id);
if (model) {
model.set(data);
} else {
rel.related.add(data);
}
});
}
}, this );
}
};
(请注意,这不能处理集合中的模型删除,仅对现有模型进行更新,以及在集合中添加新模型)