2012-10-30 4 views
5

Ho un backbone relazionale funzionante abbastanza bene finora. Ho relazioni consolidate e relazioni inverse ben consolidate (vedi sotto). Quando inizialmente denomino .fetch() sull'istanza del modello Country, l'array nominees viene analizzato perfettamente nei modelli nominee.metodo backbone-relational .set() che non aggiorna i modelli correlati

Quando chiamo .fetch() più tardi, tuttavia, questi modelli sono collegati non aggiornare, anche se i dati nominee è cambiato (per esempio il valore del voto è incrementato). In sostanza sembra che il metodo .set() di Backbone comprenda le relazioni inizialmente ma non successivamente.

Nazione Modello

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 
      } 
     } 
    ] 
}); 

risposta JSON su

{ 
    "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 
    } 
    ] 
} 

Qualsiasi aiuto sarebbe molto apprezzato, come sempre.

risposta

2

Quindi sembra che il backbone relazionale rinunci specificamente alle relazioni di aggiornamento automaticamente (vedere il metodo updateRelations) e emette semplicemente un evento relational:change:nominees che i tuoi modelli possono scegliere come target. Se, tuttavia, si desidera aggiornare a livello di codice i tuoi modelli correlati, è sufficiente modificare il metodo di updateRelations come segue:

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

(Si noti che questo non gestisce la cancellazione dei modelli da una collezione, solo gli aggiornamenti di modelli esistenti e la aggiunta di nuovi modelli per una collezione)

0
Uncaught TypeError: Object [object Object] has no method 'add' 

su

rel.related.add(data);