2011-10-04 2 views
1

Si je JSON.stringify un modèle de colonne vertébrale avec des collections/modèles imbriqués, l'envoyer par websockets à un autre client de la colonne vertébrale et JSON.parse le mode model = JSON.parse(model) fonctionnera le modèle de variables comme il l'a fait sur l'autre client?Transport de modèles backbone.js?

Répondre

7

No.

Peut-être que je vais développer. Quand je fais cela:

var o = JSON.parse(JSON.stringify(model)); 

je me retrouve avec un objet simple o. Pourquoi? Eh bien, tout d'abord, JSON.parse() ne sait rien sur les types non-primitifs (où Array et Object sont considérés comme primitifs) et en particulier, il ne sait pas ce qu'est un modèle Backbone, donc il ne peut pas en reconstruire un. En outre, JSON.stringify appellera la méthode toJSON sur son argument (s'il en a un bien sûr) et Backbone supplies a toJSON qui renvoie simplement une copie des attributs du modèle en tant qu'objet simple (éventuellement imbriqué). Donc, une fois que vous avez la sortie de JSON.stringify(model), il n'y a pas de connexion du tout entre la chaîne et le modèle, vous avez simplement un ancien objet JavaScript sérialisé. Si vous souhaitez déplacer un modèle Backbone d'un système à un autre, je pense que vous devrez suivre tous les types d'objet et de modèle, puis reconstruire votre morceau sérialisé du graphique d'objet à la main de l'autre côté .

Vous seriez probablement mieux sauver le modèle à son URL, envoyer l'ID à l'autre client de Backbone, puis le recharger à partir de l'URL du modèle comme d'habitude. JSON est pour la sérialisation des données, pas des objets, l'interprétation des données en tant qu'objets est laissé à l'application.

+0

Merci pour la bonne réponse. Je fais cela partout sur des websockets donc je vais probablement concevoir une méthode pour reconstruire l'état à partir des données primitives. – fancy

+0

@Lochlan: La question portait sur la copie d'instances de modèle d'un endroit à un autre. Dans un endroit, vous devrez 'JSON.stringify (model)' pour obtenir une chaîne (au format JSON) que vous pourriez envoyer ailleurs. Ensuite, quelque part (ou quelque temps), vous décompressez cette chaîne avec 'JSON.parse'. –

2

Je sais backbone maintient un identifiant interne pour chacun de ses objets si vous les transférez comme vous le suggérez, je ne sais pas comment cela pourrait fonctionner sans possibilité de conflit ou de double cid.

Du site de colonne vertébrale:

Une propriété spéciale des modèles, l'identifiant cid ou client est un identifiant unique attribué automatiquement à tous les modèles quand ils sont d'abord créé . Les identifiants de client sont pratiques lorsque le modèle n'a pas encore été enregistré sur le serveur et qu'il n'a pas encore son vrai identifiant, mais que le doit déjà être visible dans l'interface utilisateur. ids clients prennent la forme: c1, c2, c3 ...

EDIT:

Après la lecture 'mu est trop courte' réponse Je suis d'accord avec sa réponse, mais d'ajouter un peu à son commentaire explaination il est parti en bas que j'ai trouvé très instructif. Parce que le modèle backbone.js a une fonction toJSON(), lorsque vous appelez JSON.stringify (model), il n'analyse pas toutes les propriétés comme vous le penseriez, il ne fait qu'analyser l'objet renvoyé par la méthode toJSON() . Excellente réponse pour 'mu est trop court'.

Infos JSON.stringify MDN(): https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/JSON/stringify

+0

Mais le 'cid' n'apparaît pas dans la sortie' JSON.stringify() ', Backbone' toJSON() 'ne renvoie que les attributs du modèle. Vous devrez donc effectuer toute la sérialisation à la main, puis trier les éléments de type model et object-id de l'autre côté pour reconstruire le graphique. Essayez de faire un 'console.log (JSON.parse (JSON.stringify (model)))' avec l'un de vos modèles Backbone et vous verrez ce qui se passe. –

+0

@muistooshort bonne réponse et merci pour l'information JSON.stringify(). –

Questions connexes