Метод backbone-relational .set() не обновляет связанные модели

До сих пор у меня магистрально-реляционная работа работала довольно хорошо. У меня есть отношения и обратные отношения, хорошо налаженные (см. ниже). Когда я сначала вызываю .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
            }
        }
    ]
});

Ответ JSON на 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
    }
  ]
}

Любая помощь будет принята с благодарностью, как всегда.


person Squirkle    schedule 30.10.2012    source источник


Ответы (1)


Таким образом, оказывается, что backbone-relational специально отказывается от автоматического обновления отношений (см. метод 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 );
    }
};

(Обратите внимание, что это не относится к удалению моделей из коллекции, а только к обновлениям существующих моделей и добавлению новых моделей в коллекцию)

person Squirkle    schedule 31.10.2012