骨干 - 权利.set()方法不更新相关模型



到目前为止,我已经有很好的骨干关系工作。我的关系和逆向关系已经建立得很好(见下文)。当我最初在我的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()

上的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
    }
  ]
}

与往常一样,任何帮助将不胜感激。

因此,看来骨干相关专门会自动放弃关系(请参阅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 );
    }
};

(请注意,这不能处理集合中的模型删除,仅对现有模型进行更新,以及在集合中添加新模型)

相关内容

  • 没有找到相关文章

最新更新