2012-08-13 9 views
21

Estoy intentando utilizar Backbone con una API.Sobrescribir la función de análisis de la red troncal

El formato de respuesta de la API por defecto es:

{ 
somemetadatas:xxx , 
results:yyy 
} 

Ya se trate de una extracción de un solo modelo o una colección.

Así que por lo que yo sé que puedo reemplazar la función Backbone parse con:

parse: function (response) { 
    return response.results; 
}, 

Pero he visto en the documentation:

de análisiscollection.parse(response)

de análisis es llamado por Backbone cada vez que ac Los modelos de ollection son devueltos por el servidor, en fetch. La función se pasa el objeto raw response y debe devolver la matriz de atributos de modelo para agregar a la colección. La implementación predeterminada de no es operativa, simplemente pasa a través de la respuesta JSON. Anule esto si necesita trabajar con una API preexistente, o mejor namespace sus respuestas. Tenga en cuenta que después, si su clase de modelo ya tiene una función parse, se ejecutará contra cada modelo obtenido.

Así que si tengo una respuesta para una colección busquen como los que:

{ 
somemetadatas:xxx , 
results:[user1,user2] 
} 

La primera parse función en la colección va a extraer [user1,user2].

Pero el doctor dice:

Tenga en cuenta que después, si la clase del modelo ya tiene una función parse, se fue a buscar correr uno contra modelo.

Por lo tanto, tratará de encontrar response.results; en user1 y user2

Necesito ambas funciones de análisis sintáctico en el modelo y la recolección debido a que ambos modelos y recogida de datas más estarán bajo el atributo resultado.

Pero si busco en una colección, no quiero que la función de análisis de modelo se use contra un único elemento de matriz.


¿Existe una solución a este problema?

pienso en una solución donde mi función de análisis de recogida va a transformar algo como esto:

{ 
somemetadatas:xxx , 
results:[user1,user2] 
} 

en algo como esto:

[ {results.user1} , {results.user2} ] 

Para que la función del modelo de análisis no fallará en una obtención de colección. Pero es un poco raro ... ¿hay alguna solución elegante para este problema?


Por cierto, ya que mi API siempre producirá resultados de esta forma, es posible anular de forma predeterminada la función parse de todos mis modelos y colecciones? (Disculpe que soy un novato JS ...)

Respuesta

27

Puede probar si los datos que recibe están envueltos por un miembro results y reaccionan en consecuencia. Por ejemplo,

var M = Backbone.Model.extend({ 
    parse: function (data) { 
     if (_.isObject(data.results)) { 
      return data.results; 
     } else { 
      return data; 
     } 
    } 
}); 

Y un violín http://jsfiddle.net/9rCH3/

Si desea generalizar este comportamiento, se derivan todas las clases del modelo de esta clase base o modificar el prototipo de la espina dorsal para proporcionar esta función:

Backbone.Model.prototype.parse = function (data) { 
    if (_.isObject(data.results)) { 
     return data.results; 
    } else { 
     return data; 
    } 
}; 

http://jsfiddle.net/9rCH3/1/

+0

gracias intentarán que –

+0

Mi costumbre 'parse' se llama, pero no tiene efecto - los valores en el modelo son sólo el ID inicial que se proporciona en el constructor ... Cualquier ideas? – Dor

+0

Si intenta hacer cosas con sus ID de modelos, no puede hacerlo desde la versión 1.1.0. http://backbonejs.org/#changelog Si no es eso, tendrá que publicar una pregunta. – nikoshr

1

Parse también debe implementarse en el Collecti en.

var EgCollection = Backbone.Collection.extend({ 
    parse: function (data) { 
     if (_.isObject(data.results)) { 
      return data.results; 
     } else { 
      return data; 
     } 
    } 
}); 

http://backbonejs.org/#Collection-parse

Cuestiones relacionadas