2016-04-05 6 views
0

Ich habe folgendes Dialogmodell:Wie kann das hierarchische Modell beim Ändern aktualisiert werden?

var DialogModel = Backbone.Model.extend({ 

    user: null, 

    constructor: function() { 
     // Initialize user model 
     this.user = new BW.user.UserModel(); 

     Backbone.Model.apply(this, arguments); 
    }, 

    parse: function (attributes) { 
     _.isObject(attributes) || (attributes = {}); 

     // update user's model data 
     this.user.set(attributes.user); 
     delete attributes.user; 

     return attributes; 
    }, 

    toJSON: fucntion() { 
     var json = Backbone.Model.prototype.toJSON.call(this); 

     // serialize user's model data to JSON 
     _.extend(json, user: this.model.toJSON()); 
    } 
}); 

Wie Sie oben aus dem Code sehen können, ich speichern user Modell in DialogModel und stellen Daten auf parse und Serialisierung in toJSON.

Als irgendwann bekomme ich dialog:update Socket-Nachricht mit den folgenden Daten:

{ 
    id: 1, 
    message: 'message', 
    user: { 
     <JSON USER DATA> 
    } 
} 

Dialog auf dieser Nachrichtendaten ich folgendes tun zu aktualisieren basiert:

eventBus.on('dialog:update', function (json) { 
    dialogModel.set(json); 
}); 

Aber das Problem ist, Das user Modell wird nicht aktualisiert Becase parse Methode wird nicht ausgeführt.

Also meine Frage ist, wie könnte ich user Modell auf set Methode aktualisieren?

+0

['parse()' wird nicht von 'set()'] aufgerufen (https://github.com/jashkenas/backbone/blob/master/backbone.js#L464). Sie sollten es manuell aufrufen oder 'DialogModel' selbst anhören (innerhalb' initialize'), um 'change' zu ​​ändern und 'user' dann zu aktualisieren. Meiner Meinung nach sollten Sie dieses UserModel lieber auf einen "Controller" verschieben und beide Modelle separat füttern. –

+0

Warum sollte 'UserModel' auf einen Controller verschoben werden? Ich baue ein hierarchisches Modell wie Backbone suggeriert http://backbonejs.org/#Model-constructor – Erik

Antwort

0

Eine Option ist das Überschreiben model.set. Hinzufügen von so etwas wie die folgenden zu Ihrem DialogModel wird der Trick:

set: function (attributes, options) { 
    this.parse(attributes); 
    Backbone.Model.prototype.set.apply(this, arguments); 
}, 

Bitte beachte, dass ich ausgewählt habe die parse Methode aufzurufen, da es die Benutzerdaten gut setzt und löscht sie aus den Attributen für uns (und verhindert so dass Daten auf dialogModel gesetzt werden).

Click here for a fiddle demonstrating this solution.

Verwandte Themen