web-dev-qa-db-fra.com

Backbone: Créer une collection à partir de JSON

J'essaie de charger JSON (à partir de json_encode de php) dans une collection Backbone JS. J'ai simplifié le problème à:

var myJSON = '[{ "id":"1","name":"some name","description":"hmmm"}]';

var myCollection = new MyCollection(myJSON, { view: this });

Et:

MyObject = Backbone.Model.extend({

  id: null,
  name: null,
  description: null
});

MyCollection = Backbone.Collection.extend({ 
model: MyObject,
initialize: function (models,options) { }
});

Erreur: 

Uncaught TypeError: impossible d'utiliser l'opérateur 'in' pour rechercher 'id' dans

Problème similaire: Backbone: récupérer la collection depuis le serveur

Mon JSON semble certainement être dans le bon format, est-ce que je manque quelque chose d’évident? J'ai essayé d'utiliser simplement id: "1" par opposition à "id" avec le même résultat.

16
pws5068

Votre JSON est toujours au format chaîne. Transmettez-le à JSON.parse avant de l'assigner:

var myJSON = JSON.parse('[{"id":1,"name":"some name","description":"hmmm"}]');
13
kinakuta

Vous avez oublié le hash defaults dans votre modèle.

MyObject = Backbone.Model.extend({
  defaults: {
    id: null,
    name: null,
    description: null
  }
});

Voir la documentation

3
Paul

donc je manque peut-être le point complètement mais les problèmes semblent être les "guillemets simples" autour du tableau. C'est ça:

var myJSON = '[{ "id":"1","name":"some name","description":"hmmm"}]';

devrait être:

var myJSON = [{ "id":"1","name":"some name","description":"hmmm"}];

Php, afik, n'ajoute pas les guillemets simples, il devrait donc être aussi simple que de changer une ligne qui dit:

$my_js = "var myJSON = '" . json_encode($my_array_to_send)) . "';";

à:

$my_js = "var myJSON = " . json_encode($my_array_to_send)) . ";  ";
0
ErichBSchulz