2011-03-31 14 views
14

Estoy tratando de recuperar una colección de mi servidor. estoy usando la versión 0.3.3 (no el maestro de github) Sin embargo estoy corriendo en esta excepción:Red troncal: colección de recuperación desde el servidor

Uncaught TypeError: Cannot use 'in' operator to search for 'id' in {id=MyId, active=true} 
    jQuery.jQuery.extend._Deferred.deferred.resolveWith (jquery.js:869) 
    done (jquery.js:6591) 
    jQuery.ajaxTransport.send.callback 

Ésta es la manera que he creado el error:

var MyModel = Backbone.Model.extend(); 
var MyCollection = Backbone.Collection.extend({ 
    url: '/api/collection', 
    model: MyModel 
}); 
var coll = new MyCollection(); 
coll.fetch(); 

Los elementos in/api/collection se analizan en JSON. Traté de devolverlos en varios formatos

["Id1", "Id2", ... ] 
[{id: "Id1, somethingElse: "..."}, ...] 
{id1: { id1s content}, id2: { ... }, ...} 

Sin embargo el error era siempre la misma. ¿Qué hay de malo con este código?

[Editar] No ayuda a establecer un error a través de coll.fetch({error: errorFunc}); La excepción se mantiene igual.

[Edit2] Bueno, parece que todo funciona bien hasta collection.fetch() llamadas collection.refresh() con el objeto de respuesta. No he sobrescrito ninguna de estas funciones.

[Edit3] El error está en el método collection.add() y la razón es que mis elementos son una lista de cadenas ... Mi servidor las envió incorrectas.

+0

Usted dice que su servidor envió que están equivocados; ¿cómo los envías ahora para que funcione? Puede ser útil para otros (como yo) – Ariejan

+0

en lugar de ["id1", "id2", ..., "idn"] el cliente espera [{"id": "id1"}, ... {"id" : "idn"}] –

+0

Estoy literalmente haciendo eco de '[{"id": "100"}]' de mi servidor para probarlo ... sin embargo, todavía da el mismo error ... ¿Qué es? la parte del eco de los suyos como? –

Respuesta

20

en lugar de

["id1", "id2", ..., "idn"] 

el cliente espera

[{"id": "id1"}, ... {"id": "idn"}] 
+0

Esto siempre me confunde sobre JSON :( ¿Qué formato deberíamos elegir? No digo que JSON es malo, podría necesitar leer un poquito – BlackDivine

+0

, también estoy atrapado en el mismo tipo del problema. Y en mi situación, el servidor me está dando json en el mismo formato que ha prescrito aquí ... Todavía tengo el mismo error, ¿pueden ayudarme por favor? aquí está el error y los datos: UnEught TypeError: No se puede usar operador 'in' para buscar 'length' en [{"UserId": 1, "Login": "test", "isSelected": true}, {"UserId": 2, "Login": "afdsafdsf", " isSelected ": true}, {" UserId ": 61," Login ":" werewrewman "," isSelected ": false}, {" UserId ": 62, "Iniciar sesión": "ghfgu", "isSelected": false}, .....] ... realmente agradeceré su ayuda ... gracias. –

+0

La razón por la que JSON necesita estar en ese formato es porque eso es lo que Backbone ha sido diseñado para buscar. Cada modelo tiene un atributo 'id' [consulte la documentación de Model.id] (http://backbonejs.org/#Model-id). Backbone está intentando crear una colección de modelos a partir de una matriz de cadenas de texto; eso no funcionará porque un modelo es mucho más que una sola cadena de texto. Pero si pasa una serie de objetos con el atributo 'id' establecido en una cadena, Backbone puede extender cada objeto Model con cada objeto respectivo en la matriz, estableciendo así el' id' de cada Modelo en la cadena de texto. – clayzermk1

23

Dado que ya ha identificado que su formato de respuesta no es lo que espera Backbone, debe anular su funciónModel.parse que debe tomar la respuesta de su servidor y devolver una matriz de modelos aceptables para la colección. Aquí está el fragmento de Backbone.js

// **parse** converts a response into a list of models to be added to the 
// collection. The default implementation is just to pass it through. 
parse : function(resp) { 
    return resp; 
}, 

Como puede ver, la función predeterminada simplemente pasa los datos. Tendría que hacer que funcione para su formato de respuesta.

P.S. id recomienda colocar un punto de interrupción en el método Backbone.fetch para ver qué formato proviene del servidor y dónde exactamente rompe la creación del modelo.

+1

Backbone espera una clave "id" para cada registro (puede redefinir la clave de identificador único en su modelo redeclarando idAttribute). Luego, la recuperación de la colección espera una matriz jds. – Julien

+0

Bueno, el atributo "id" solo se usa para determinar si el modelo es o no un modelo nuevo o uno existente (es decir, al momento de guardar, ¿necesitamos crearlo o actualizarlo?).El error que ocurre aquí ocurre al obtener los modelos del servidor, por lo que creo que el problema es un formato de respuesta incorrecto que JSON no analiza correctamente en un objeto o simplemente no está en un formato que el Backbone espera y por lo tanto necesita ser procesado pulido en la función "analizar" –

Cuestiones relacionadas