2012-01-16 26 views
16

Estoy intentando cargar JSON (desde json_encode de php) en una colección Backbone JS. He simplificado el problema a:Backbone: Crear colección de JSON

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

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

Y:

MyObject = Backbone.Model.extend({ 

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

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

error:

Uncaught TypeError: Cannot use 'in' operator to search for 'id' in

problema similar: Backbone: fetch collection from server

Mi JSON sin duda parece estar en la derecha formato, ¿me falta algo obvio? Intenté usar simplemente id: "1" en lugar de "id" con el mismo resultado.

Respuesta

13

Su JSON se encuentra todavía en formato de cadena. Pasarlo a JSON.parse antes de asignarlo:

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

Sí, y si los datos se recuperan usando algo como el método $ .getJSON de jquery, invocará JSON.parse en él automáticamente. –

+1

La documentación muestra pasar json directamente a la inicialización en al menos un ejemplo: http://documentcloud.github.com/backbone/#Collection-toJSON (aunque el propósito de esta demostración es cómo exportar json) – pws5068

+1

Tenga en cuenta que no mencionan que la matriz que pasan al constructor de la colección ya ha sido analizada. La documentación probablemente contenga una pequeña aclaración allí, pero lo que hay que recordar es que JSON generalmente se pasa entre el servidor y el cliente en formato de cadena y necesita ser analizado después de recibirlo o ser codificado antes de enviarlo. – kinakuta

3

Olvidó el hash defaults en su modelo.

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

Véase el documentation

+0

Ah, yo estaba tan concentrado en ver Al modificar la estructura JSON, omití esta exclusión simple. Gracias por su ayuda – pws5068

+3

el hash predeterminado es – kinakuta

+0

@kinakuta sí, el hash predeterminado es opcional, pero el modelo en el ejemplo intentaba usar la funcionalidad predeterminada sin el hash. – Paul

0

así que puede que no viene al caso por completo, pero los problemas parece ser la 'comillas simples' alrededor de la matriz. Es decir, esto:

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

debe ser:

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

PHP, Afik, no agrega las comillas simples, por lo que debe ser tan simple como cambiar una línea que dice:

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

a:

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