Tengo una colección que contiene algunos de los usuarios. Parte de la información que se necesita es cuántos totales hay, cuántas páginas, etc. ¿Cómo devuelvo esto al cliente? ¿O tienen que venir de una vista separada en cuyo caso necesitaré más de una llamada Ajax? Me gustaría tener la colección fetch()
y también recibir algunos de estos "metadatos". ¿Cuál es una buena manera de manejar esto?backbone.js - obteniendo datos adicionales junto con la solicitud
Respuesta
En general, es necesario manejar esto de la clase de colección de análisis método. Su responsabilidad es tomar la respuesta y devolver una serie de atributos del modelo. Sin embargo, podría hacer más que eso si lo deseara si no le importase que el método de análisis sintáctico tenga esta responsabilidad adicional.
UserList = Backbone.Collection.extend({
model: User,
url: '/users',
parse: function(data) {
if (!data) {
this.registered_users = 0;
return [];
}
this.registered_users = data.registered_users;
var users = _(data.users).map(
function(user_data) {
var user = {};
user['name'] = user_data.name;
return user;
}
);
return users;
}
});
Así que en el anterior ejemplo trivial, presumir el servidor devuelve una respuesta que contiene un recuento de usuarios registrados y y una serie de atributos de usuario. Ambos analizarían y devolverían los atributos del usuario y elegirían el recuento de usuarios registrados y simplemente lo establecerían como una variable en el modelo.
El método de análisis se llamará como parte de una búsqueda. Así que no hay necesidad de modificar la búsqueda, solo use el método de enlace incorporado que tiene.
Los puristas dirían que le está dando al método de análisis una responsabilidad secundaria que podría sorprender a algunas personas (por ejemplo, devolver algo y modificar el estado del modelo). Sin embargo, creo que esto está bien.
Una forma de hacerlo es anular el método Collection::fetch()
para que analice estos metadatos de la respuesta. Usted podría tener su backend devuelve una respuesta como esta:
{
"collection": [
{ ... model 1 ... },
{ ... model 2 ... },
...
],
"total_rows": 98765,
"pages": 43
}
En el método de fetch
que anula el método original Backbone.Collection::fetch()
, que puede manejar cada propiedad del objeto por separado. He aquí que podría hacer la anulación con un fetch
método ligeramente modificado:
_.extend(Backbone.Collection.prototype, {
fetch : function(options) {
options || (options = {});
var collection = this;
var success = options.success;
options.success = function(resp) {
// Capture metadata
if (resp.total_rows) collection.total_rows = resp.total_rows;
if (resp.pages) collection.pages = resp.pages;
// Capture actual model data
collection[options.add ? 'add' : 'refresh'](
collection.parse(resp.collection), options);
// Call success callback if necessary
if (success) success(collection, resp);
};
options.error = wrapError(options.error, collection, options);
(this.sync || Backbone.sync).call(this, 'read', this, options);
return this;
});
Tenga en cuenta que este enfoque utilizando _.extend
afectará a todos los sus clases que se extienden Backbone.Collection
.
De esta manera, no tiene que hacer 2 llamadas por separado al servidor.
No creo que anular un método de framework sea el enfoque correcto para resolver este problema.En su lugar, desea vivir dentro de los métodos de gancho para lograr lo que se le pide. Parse parece ser un lugar apropiado para este tipo de cosas. La anulación de un método de estructura deja el peligro de que cuando desee actualizar backbone.js, es posible que las cosas no funcionen como se esperaba o que no pueda aprovechar cualquier nueva funcionalidad que haya sido asignada a ese método. –
Tiene razón, generalmente no desea afectar todos los métodos que heredan del prototipo de marco. Por alguna razón, asumí que OP deseaba esta funcionalidad en todas las clases de Colección y anular el método de marco es una manera conveniente de hacerlo. El método 'parse' parece ser un mejor lugar para hacer esto, de todos modos. – Sam
Arrancaría la información en pagecreation. Escriba la información en el documento html cuando el servidor crea el sitio. Así no tienes que tener una llamada ajax en absoluto. Lo hago con toda la colección en ordner para no cargar primero la página y luego esperar a que la llamada ajax devuelva la información necesaria.
Ejemplo de código con Python:
Línea 64: https://github.com/ichbinadrian/maps/blob/master/python/main.py < - de aquí
Línea 43: https://github.com/ichbinadrian/maps/blob/master/templates/index.html < - entrar aquí
- 1. Backbone.Js Envío de datos con destroy()
- 2. ¿Se pueden enviar datos adicionales que no son del modelo en una solicitud de guardado con backbone.js?
- 3. Enviar solicitud de publicación junto con HttpHeaders en Android
- 4. Enviando un encabezado personalizado junto con la solicitud qtwebkit
- 5. Backbone.js DELETE solicitud no dispara
- 6. Obteniendo la dirección IP de la solicitud con Pyramid
- 7. Validar formularios symfony2 con campos adicionales
- 8. AutoMapper junto con la inyección de dependencias
- 9. Enviar datos de campos adicionales con Uploadify
- 10. Método de solicitud PATCH en Backbone.js
- 11. Backbone.js model.destroy() no está enviando la solicitud DELETE
- 12. Objetos gestionados de datos principales con métodos y datos adicionales
- 13. Agregue datos adicionales a la entrada simple_form
- 14. Obteniendo la respuesta de la solicitud http sin contenido-longitud?
- 15. Backbone.js con Rails
- 16. Almacenamiento de datos adicionales en la tabla aspnet_profile con datos de membresía
- 17. Tridion: ¿Cuál debería ser la solicitud xml utilizando Business Connector para descargar las imágenes junto con los datos xml?
- 18. Obteniendo el URI de solicitud original con PrettyFaces
- 19. Backbone.js modelo con la colección
- 20. búsqueda inicial de datos backbone.js
- 21. Obteniendo la suma de una colección (todos los modelos) con backbone.js
- 22. Pasar datos adicionales a EditorTemplate
- 23. stub_chain junto con should_receive
- 24. Enviando datos junto con una redirección en CodeIgniter
- 25. Obteniendo URL de solicitud en un servlet
- 26. Backbone.js en base de datos MySQL
- 27. Personaliza QListWidgetItem con datos adicionales para almacenar, ¿Cómo?
- 28. ¿Cómo puedo trabajar con archivos Gzip que contienen datos adicionales?
- 29. ¿Cómo agrupar archivos adicionales (datos) con un módulo de Netbeans?
- 30. Parámetros adicionales con socket.io
¿Podría dar más información? ¿Cómo se ve tu servidor? ¿Qué navegadores necesitas para apoyar? ¿Con qué frecuencia obtienes tus datos? – tjameson
@tjameson Mi servidor es solo nginx usando php. No necesito admitir ningún navegador en particular (solo puedo apoyar Chrome y Firefox si quiero). Obtengo mis datos con relativa frecuencia (son solo operaciones crud) cambiando el número de página o haciendo una búsqueda rápida, etc. – Matthew