J'essaie de remplir une collection à partir d'un fichier JSON simple dans le cadre de l'apprentissage de backbone.js. Mais je ne peux pas le faire fonctionner.
L'appel AJAX est effectué (vérifié avec FireBug), mais la méthode toJSON
renvoie undefined
.
Qu'est-ce que je fais mal?
theModel = Backbone.Model.extend(); theCollection = Backbone.Collection.extend({ model: aModel, url: "source.json" }); theView = Backbone.View.extend({ el: $("#temp"), initialize: function () { this.collection = new theCollection(); this.collection.fetch(); this.render(); }, render : function () { $(this.el).html( this.collection.toJSON() ); // Returns blank } }); var myView = new theView;
Voici mon JSON:
[{ "description": "Lorem ipsum..." }, { "description": "Lorem ipsum..." }]
fetch
est asynchrone, votre collection ne sera pas encore remplie si vous appelez immédiatement render
. Pour résoudre ce problème, il suffit de lier l'événement de réinitialisation de la collection (événement de synchronisation pour Backbone> = 1.0) au rendu de la vue:
theView = Backbone.View.extend({ el: $("#temp"), initialize: function () { this.collection = new theCollection(); // for Backbone < 1.0 this.collection.on("reset", this.render, this); // for Backbone >= 1.0 this.collection.on("sync", this.render, this); this.collection.fetch(); }, render : function () { console.log( this.collection.toJSON() ); } });
Notez le troisième argument de la méthode bind, en donnant le contexte correct à la méthode: http://documentcloud.github.com/backbone/#FAQ-this
Je crois que le problème réside dans votre json
Soit vous remplacez la méthode d'analyse sur la collection, pour travailler avec votre json
Ou vous pourriez changer le json 🙂
[{ "description": "Lorem ipsum..." }, { "description": "Lorem ipsum..." }]
Je crois que c'est à quoi ressemble votre json, juste un éventail de vos modèles.