backbone-relational .set()方法不更新相关模型

时间:2012-10-30 17:29:10

标签: javascript backbone.js backbone-relational

到目前为止,我的骨干关系工作得相当好。我建立了良好的关系和反向关系(见下文)。当我最初在.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()

上的JSON响应
{
  "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
    }
  ]
}

任何帮助都将一如既往地受到高度赞赏。

1 个答案:

答案 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 );
    }
};

(请注意,这不会处理从集合中删除模型,只处理对现有模型的更新,以及向集合添加新模型)