Foros del Web » Programando para Internet » Javascript » Frameworks JS »

[SOLUCIONADO] Backbonejs: ¿Como pasar una colección a un template?

Estas en el tema de Backbonejs: ¿Como pasar una colección a un template? en el foro de Frameworks JS en Foros del Web. Hola, contarles que estoy trabajando con backbone y django rest framework Una vez creada la api rest y ya con datos en el servidor, creo ...
  #1 (permalink)  
Antiguo 05/07/2014, 09:14
Avatar de cristian_cena
Colaborador
 
Fecha de Ingreso: junio-2009
Mensajes: 2.244
Antigüedad: 14 años, 10 meses
Puntos: 269
Backbonejs: ¿Como pasar una colección a un template?

Hola, contarles que estoy trabajando con backbone y django rest framework

Una vez creada la api rest y ya con datos en el servidor, creo el modelo y la coleccion backbone:
Código Javascript:
Ver original
  1. var Contact = Backbone.Model.extend();
  2. var Contacts = Backbone.Collection.extend({
  3.     url: '/api/contacts/', //en esta url esta la api rest  
  4.     model: Contact
  5. });
Hasta acá todo bien, el problema viene cuando intento pasar la coleccion al template por medio de una vista:
Código Javascript:
Ver original
  1. var ContactView = Backbone.View.extend({
  2.     initialize : function () {
  3.         this.render();
  4.     },
  5.     render: function(){
  6.         var c = new Contacts();
  7.         var datos;
  8.         var data = c.fetch({
  9.             success: function (model, resp){
  10.                 console.log(model); //child {length: 5, models: Array[5], _byId: Object, constructor: function, url: "/api/contacts/"…}
  11.                 console.log(resp);  //[Object, Object, Object, Object, Object]
  12.                 datos = resp
  13.                 console.log(datos); //[Object, Object, Object, Object, Object]
  14.             },
  15.             error: function (model, resp){
  16.                 console.log("error");
  17.             }
  18.         });
  19.        
  20.         //var data = c.fetch();
  21.         //console.log(data.toJSON()); //[ ] un maldito arreglo vacío.
  22.  
  23.         console.log(data);  //Object {readyState: 1, responseJSON: Array[5], responseText: "[{"url": "http://localhost:8000/api/contacts/1/", "id": 1, "first_name": "Alice", "last_name": "Arten", "phone_number": "555-0184"}, {"url": "http://localhost:8000/api/contacts/2/", "id": 2, "first_name": "Bob", "last_name": "Brigham", "phone_number": "555-0163"}, {"url": "http://localhost:8000/api/contacts/3/", "id": 3, "first_name": "Charlie", "last_name": "Campbell", "phone_number": "555-0129"}, {"url": "http://localhost:8000/api/contacts/4/", "id": 4, "first_name": "Vic", "last_name": "Vil", "phone_number": "999-3659"}, {"url": "http://localhost:8000/api/contacts/5/", "id": 5, "first_name": "chango", "last_name": "cena", "phone_number": "123-4567"}]"}
  24.         console.log(datos);   //undefined  
  25.  
  26.         var template = _.template( $("#lista_template").html(), data);  //Aqui data debería ser [Object, Object, Object, Object, Object]
  27.         this.$el.html( template );
  28.     }
  29. });
Como se puede observar, la variable data almacena:
  1. o "undefined"
  2. o un arreglo vacío
  3. o un objeto que tiene una propiedad llamada responseText y otra responseJSON (si llamo a estas con data.responseText lo que obtengo es nuevamente "undefined")

Pero lo que yo necesito es el array de objetos que devuelve el argumento resp del método success cuando hacemos fecth() a la colección.
¿Como puedo obtener dicho array?

Desde ya muchas gracias.
Saludos

Última edición por cristian_cena; 05/07/2014 a las 09:24
  #2 (permalink)  
Antiguo 07/07/2014, 19:00
Avatar de abimex
Colaborador
 
Fecha de Ingreso: marzo-2007
Ubicación: ~
Mensajes: 751
Antigüedad: 17 años, 1 mes
Puntos: 137
Respuesta: Backbonejs: ¿Como pasar una colección a un template?

Lo tienes que hacer en el success del fetch porque fetch funciona de manera asíncrona.

La forma tradicional es hacer el fetch y dentro del success crear la instancia a la vista pasándole como model la colección que acabas de recibir.

Saludos!
__________________
>> abimaelmartell.com
  #3 (permalink)  
Antiguo 14/07/2014, 22:48
Avatar de cristian_cena
Colaborador
 
Fecha de Ingreso: junio-2009
Mensajes: 2.244
Antigüedad: 14 años, 10 meses
Puntos: 269
Respuesta: Backbonejs: ¿Como pasar una colección a un template?

Hola abimex, antes que nada, muchísimas gracias por responderme, pude solucionarlo!!!

Código Javascript:
Ver original
  1. var Modelo = Backbone.Model.extend();
  2.  
  3. var Coleccion = Backbone.Collection.extend({
  4.     url: '/api/contacts/', //en esta url esta la api rest
  5.     model: Modelo
  6. });
  7.        
  8. var Vista = Backbone.View.extend({});
  9.  
  10. $(function(){
  11.     var mycollection = new Coleccion();
  12.  
  13.     mycollection.fetch({
  14.        success: function (data) {
  15.             console.log("success con exito");  
  16.             var datos = new Array();
  17.             for (var i = 0; i < data.models.length; i++) {
  18.                 datos.push(data.models[i].attributes);
  19.             };
  20.             var contactos = { contactos : datos }; console.log(contactos);
  21.             var template = _.template( $("#lista_template").html(), contactos);
  22.  
  23.             var myview = new Vista({ el: $("#lista_container") });
  24.             myview.$el.html( template );
  25.        }    
  26.     });
  27. });
Código HTML:
Ver original
  1. <div id="lista_container"></div>
  2. <script type="text/template" id="lista_template">
  3.     <ul>
  4.         <% _.each(contactos, function(contacto) { %>
  5.             <li>
  6.                 <% print(contacto.first_name); %>
  7.             </li>
  8.         <% }); %>
  9.     </ul>

Efectivamente se imprimen los nombres de los contactos en la lista, muchas gracias!

Aunque me late que es posible mejorar este código, ojalá puedas compartirme algun consejo o enlace para estudiar
Desde ya muchas gracias nuevamente, un saludo.

Última edición por cristian_cena; 15/07/2014 a las 06:56
  #4 (permalink)  
Antiguo 15/07/2014, 13:52
Avatar de abimex
Colaborador
 
Fecha de Ingreso: marzo-2007
Ubicación: ~
Mensajes: 751
Antigüedad: 17 años, 1 mes
Puntos: 137
Respuesta: Backbonejs: ¿Como pasar una colección a un template?

no necesitas crear un arreglo con los atributos como hash, el metodo toJSON de la collection te da eso.

Saludos :)
__________________
>> abimaelmartell.com

Etiquetas: django, fetch, responsetext, rest, template, vista
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:04.