2012-04-12 4 views
1

BASIC FRAGE
Ich versuche, ein Objekt durch socket.emit zu senden(), aber das Objekt nicht vollständig gesendet wird. Ich kann nur sein, Missverständnis, wie dies zu tun, aber hier ist das Beispiel:Ausstrahlen eines Backbone.js Modell durch Socket.io

console.log(object) 

ERGEBNISSE IN

{ length: 8, 
    models: 
    [ { attributes: [Object], 
     _escapedAttributes: {}, 
     cid: 'c1', 
     changed: {}, 
     _silent: {}, 
     _pending: {}, 
     _previousAttributes: [Object], 
     lots: [Object], 
     _changing: false, 
     collection: [Circular], 
     _callbacks: [Object] }, 
    ... ETC 

Während

socket.emit(e,object); 

ERGEBNISSE IN:

{"name":"read:AllAuctions","args": 
[[{"auctionId":"298"},{"auctionId":"381"},{"auctionId":"385"}, 
{"auctionId":"393"},{"auctionId":"394"},{"auctionId":"395"}, 
{"auctionId":"402"},{"auctionId":"800"}]]} 

Es kommt zum Front-End in der Letztes Format.

WEISE MEHR DETAIL
Ich habe einen Server erstellt, die eine clientseitige Rückgrat Modell socket.io zu aktualisieren versucht. Ein Teil davon wird mit den Ideen, die hier angegeben:

http://developer.teradata.com/blog/jasonstrimpel/2011/11/backbone-js-and-socket-io

Der Unterschied ist, dass ich Rückgrat Modelle auf dem Backend erstellt haben. Meine Logik bestand darin, die grundlegenden Modelldateien zu teilen und das Back-End damit zu beauftragen, mit der Persistanzschicht zu kommunizieren und die "wahre" Datenquelle zu optimieren, aber dann auf Anfragen zum Abrufen dieser Modelle/Sammlungen sowie auf automatische Updates zu reagieren .

Alles scheint zu funktionieren, aber ich soll das Modell auf das Frontend übertragen. Muss ich JSON oder eine andere Methode, die es tatsächlich für den Transport konvertiert, erweitern/überschreiben? Wenn ja, wie mache ich das? Jede Hilfe, die Sie mir geben können, würde sehr geschätzt werden!

Antwort

0

Ich hasse meine eigene Frage zu beantworten, aber ich fand das Problem in einer anderen Frage: Saving Backbone model and collection to JSON string

Im Wesentlichen, was ich nicht erkannte, war, dass toJSON() nur die Attribute des Modells zurückgibt. Meine Modelle enthielten eine Sammlung anderer Modelle, also musste ich JSON() überschreiben.

Sammlungen rufen das toJSON() ihres Kindmodells auf. Also musste ich schließlich die Funktion toJSON des Modells ändern, um die Attribute UND die Sammlung der darin enthaltenen Modelle zurückzugeben.

Hier ist das Beispiel: „auctionId“

var Auction = Backbone.Model.extend({ 
    defaults: { 
    auctionId : null 
    }, 
    toJSON : function() { 
    var returnObject = {}; 
    returnObject["auctionId"] = this.get("auctionId"); 
    returnObject["lots"] = this.lots; 
    return returnObject; 
    }, 
    initialize : function() { 
    this.lots = new Lots; 
    } 
}); 

Bitte in meinem Beispiel beachten, dass nicht alle Attribute des Modells zurückkehrt, ich bin das Attribut nur Rückkehr Dies erschien mir sicherer, weil ein anderer Entwickler hier später Attribute hinzufügen könnte, die nicht transportiert werden müssen.Vor diesem Hintergrund ist es wahrscheinlich besser, ein Element des returnObject mit allen Attributen zu versehen. Dadurch wurde mein Modell auf der Clientseite ein wenig einfacher.

1

Ich denke, dass Sie nur die Daten senden und das Objekt auf der Clientseite neu erstellen sollten.

Dafür könnten Sie versuchen Backbone Collection toJSON

socket.emit(e, object.toJSON()); 
+0

Ich dachte, dass das Problem auch sein könnte, aber es macht das gleiche. Besteht die Möglichkeit, dass ich die toJSON-Methode für diese Sammlung überschreiben muss, um sicherzustellen, dass sie auch den gesamten Körper jedes Kindmodells zurückgibt? Ich habe das versucht, aber ich könnte es falsch gemacht haben, weil es dasselbe zurückgebracht hat. – NateDSaint

+1

Danke für Ihre Hilfe! Es stellt sich heraus, dass der Socket bereits versuchte, es mithilfe von toJSON zu codieren, aber meine toJSON-Funktion gab nur die Attribute der Modelle in der Sammlung zurück. – NateDSaint

1

Vor dem Senden Verwendung JSON.stringify mit und deserialisieren am anderen Ende mit JSON.parse

+0

Ich bekomme das gleiche Problem. Das komplexe Objekt wird nur zu einem Array von Name: Wert-Paaren für das eine Attribut in jedem Modell in der Sammlung. – NateDSaint

+0

Danke für Ihre Hilfe! Ich wusste nicht, dass toJSON nur ein Objekt zurückgibt, das für die JSON-Stringifizierung bereit ist. – NateDSaint