2012-06-17 4 views
15

Lors du chargement de la page, j'amorce mes données dans mes collections via this technique. Cela fonctionne très bien, mais je suis confronté à un problème où j'ai des sous-modèles qui doivent également être lancés. Par exemple, je renvoie une collection JSON appelée Book, et chaque bibliothèque contient 10-20 modèles eux-mêmes appelés Pages. Si j'essaie d'accéder directement à Pages, j'obtiens l'erreur [object][object] car Backbone ne peut pas deviner de quel type d'objet il s'agit.backbone.js - utilisation de l'analyse sans appeler fetch

Auparavant, lorsque j'utilisais fetch, je pouvais contourner ce problème en utilisant des collections qui contenaient une action parse. En parse je ferais quelque chose comme:

Collection_Books = Backbone.Collection.extend({ 
    model: Model_Book, 
    parse: function (response) { 
     response.Pages = new Collection_Pages(response.Pages); 
     return response; 
    } 
}); 

Maintenant que j'accéder aux données directement et non à l'aide fetch, la documentation implique que je n'ai plus accès à la méthode parse.

Si je n'utilise pas fetch ou si j'appelle un serveur lors du chargement de la page, comment puis-je diffuser des sous-modèles à l'aide de l'exemple Books> Pages?

+0

Si vous êtes autorisé à ajuster un peu votre méthode constructor/initialize, vous pouvez certainement y configurer des modèles enfants. Un peu plus de détails vers la fin de ce post: http://bit.ly/KKHItJ – rjz

+0

Votre lien _this technique_ est cassé – Madbreaks

Répondre

11

Mise à jour: Cette réponse est maintenant obsolète, voir uglymunky's answer pour des informations plus à jour.


Vous avez raison, parse est only specified to be called during fetch donc il ne sera pas appelée lorsque vous construisez une collection à partir des données brutes.

Mais, puisque vous contrôlez les données brutes que vous utilisez pour amorcer votre collection, vous pouvez appeler parse vous de votre collection:

var c = new YourCollection(
    YourCollection.prototype.parse([ 
     // attribute data goes here... 
    ]) 
); 

Démo: http://jsfiddle.net/ambiguous/kdaZ3/

Vos parse méthodes (tant pour la collecte et le modèle) ne devrait pas se soucier de leur contexte d'appel, donc les appeler directement à partir du prototype devrait être bien.

+1

Je pense que c'est à peu près la troisième fois que vous m'avez renfloué avec backbone.js. Je vous dois encore une fois merci :) – boolean

56

Je ne sais pas si cela est nouveau, mais il semble que vous pouvez aussi simplement définir la propriété parse du paramètre options pour votre constructeur true, indiquant ainsi au constructeur d'utiliser votre méthode d'analyse syntaxique:

modelInstance = new MyModel(obj, {parse: true}); 

+1

Note: cela fonctionne sur le constructeur de la collection, par exemple. var books = new Collection_Books (json, {parse: true}); – Element

+2

Cela devrait être la réponse acceptée maintenant ... – Ben

+0

Ceci est un nouveau comportement, Backbone n'avait pas cette option lorsque la question a été posée. Je suppose que nous devrons simplement attendre jusqu'à ce que le "accepter" soit changé. –

Questions connexes