到目前为止,我的骨干关系工作得相当好。我建立了良好的关系和反向关系(见下文)。当我最初在.fetch()
模型实例上调用Country
时,nominees
数组会完美地解析为nominee
个模型。
然而,当我稍后再次呼叫.fetch()
时,即使nominee
数据已更改(例如,投票计数已增加),这些相关模型也不会更新。从本质上讲,Backbone的.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
}
]
}
任何帮助都将一如既往地受到高度赞赏。
答案 0 :(得分:2)
因此,似乎骨干关系专门放弃了自动更新关系(请参阅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 );
}
};
(请注意,这不会处理从集合中删除模型,只处理对现有模型的更新,以及向集合添加新模型)