serializers ember ember.js ember-data

ember.js - ember - Acceder a metainformación pasada en una respuesta de servidor json



ember serializers (3)

Estoy usando el Ember-Data Rest-Adapter y el JSON devuelto por mi servidor se ve básicamente como el de la Documentación de Serializadores del Modelo Activo

{ "meta": { "total": 10 }, "posts": [ { "title": "Post 1", "body": "Hello!" }, { "title": "Post 2", "body": "Goodbye!" } ] }

La recuperación de los datos del servidor funciona, pero desafortunadamente no puedo averiguar dónde puedo acceder a la metainformación de mi respuesta JSON.

En base a mi investigación en el problema github de ember-data, el soporte para metainformación parece implemented con commit 1787bff .

Pero incluso con los casos de prueba, no pude averiguar cómo acceder a la metainformación.

App.PostController = Ember.ArrayController.extend({ .... requestSearchData: function(searchParams){ posts = App.Post.find(searchParams); this.set(''content'', posts); // don''t know how to access meta["total"] // but I want to do something like this: // this.set(''totalCount'', meta["total"]) } })

¿Puede alguno de ustedes arrojar algo de luz sobre esto para mí, por favor? Soy consciente de que la api Ember se está moviendo rápido, pero estoy seguro de que me falta una pequeña parte y que esto es realmente posible.


Creo que la solución inmediata para usted sería adjuntar totalCount a su modelo (recordArray), consulte este thread .

Otra forma de hacerlo sería crear su propio adaptador:

DS.Adapter.create({ find: function (store, type, id) { $.ajax({ url: type.url, dataType: ''jsonp'', context: store, success: function(response){ this.load(type, id, response.data); } }); }, findAll: function(store, type) { $.ajax({ url: type.url, dataType: ''jsonp'', context: store, success: function(response){ this.loadMany(type, response.data); } }); } });

El parámetro de respuesta en la devolución de llamada de éxito en el método findAll, debe ser un objeto que necesite:

response: { meta: { totalCount: 10 }, posts: [{}, {}] }

Espero que esto ayude.


Descubrí una forma de acceder a la metainformación aprobada en una respuesta. Pero, desafortunadamente, no parece ser compatible con los datos de la memoria emergente, y estoy escribiendo la metainformación en una variable global a la que estoy accediendo a través de enlaces en el controlador solicitante.

Terminé personalizando el serializador que usa RESTAdapter:

App.CustomRESTSerializer = DS.RESTSerializer.extend({ extractMeta: function(loader, type, json) { var meta; meta = json[this.configOption(type, ''meta'')]; if (!meta) { return; } Ember.set(''App.metaDataForLastRequest'', meta); this._super(loader, type, json); } }); App.Store = DS.Store.extend({ revision: 11, adapter: DS.RESTAdapter.create({ bulkCommit: false, serializer: App.CustomRESTSerializer }) });

Soy consciente de que esto no es particularmente bonito y de hecho creo que esto va en contra de lo que esperan los datos de ember, pero por el momento está funcionando correctamente.

Trataré de hacer que esto funcione con datos de ascuas de una mejor manera y enviar una solicitud de extracción cuando esté funcionando o abrir un problema en github cuando alguien más esté interesado en hacer que esto funcione.

Si alguien encuentra una solución más limpia a esto, hágamelo saber.


Encontré un enfoque más limpio para extraer metainformación de la respuesta del servidor con Ember-Data.

Tenemos que decirle al serializador qué metainformación esperar (en este caso, paginación):

App.serializer = DS.RESTSerializer.create(); App.serializer.configure({ pagination: ''pagination'' }); App.CustomAdapter = DS.RESTAdapter.extend({ serializer: App.serializer }); App.Store = DS.Store.extend({ adapter: ''App.CustomAdapter'' });

Después de eso, cada vez que el servidor envía una meta-propiedad con un objeto de paginación, este objeto se agregará a la propiedad TypeMaps la tienda para la Clase-Clase solicitada.

Por ejemplo con la siguiente respuesta:

{ ''meta'': {''pagination'': { ''page'': 1, ''total'': 10 } }, ''posts'':[ ... ] }

El TypeMap para App.Post-Model incluiría el objeto de paginación una vez que las publicaciones se hayan cargado.

No se puede observar directamente la propiedad TypeMaps de la tienda, así que agregué una propiedad calculada a PostsController para tener acceso a la metainformación de paginación de las solicitudes:

App.PostsController = Ember.ArrayController.extend({ pagination: function () { if (this.get(''model.isLoaded'')) { modelType = this.get(''model.type''); this.get(''store'').typeMapFor(modelType).metadata.pagination } }.property(''model.isLoaded'') });

Realmente no creo que sea una gran solución para el problema de la metainformación, pero esta es la mejor solución que pude obtener con Ember-Data. Tal vez esto sea más fácil en el futuro.