2012-04-06 12 views
5

Para aprender la estructura principal Im creando una aplicación similar a Twitter. Entonces, usted sabe que Twitter envía una solicitud GET al servidor cada N segundos para verificar si hay nuevos tweets. Si hay nuevos tweets, crea los elementos ocultos li y muestra el botón con "N nuevos tweets". Si hace clic en él, muestra los elementos ocultos li, que muestran los nuevos tweets. Pero el comportamiento es diferente cuando agrega un nuevo tweet: el tweet es visible. No tiene que hacer clic en el botón para verlo.Backbone collection.create() no devuelve el modelo actualizado

Ya he hecho la primera parte, para los tweets ocultos. Para la parte de la publicación de un nuevo tweet y que lo muestra direclty de, pensé que sería fácil de hacer mediante la creación del nuevo modelo, llamando collection.create() y que activa el evento correcto, algo así como:

var newTweet = new Tweet(); 
newTweet.set(/* set the attributes here. Some attributes are missing, because they are calculated server side */); 

var created_tweet = this.collection.create(newTweet, { silent: true, wait: true }); // I choose silent=true because the add event on my collection is in charge of adding the new hidden tweets when there are new ones on the server 
this.collection.trigger("posted_new_tweet", created_tweet); 

Entonces , mi colección está suscrita al evento "posted_new_tweet", por lo que cada vez que un usuario publica un nuevo tweet, se está llamando a un método específico de mi colección. Este enfoque funcionaba bien hasta que recibí errores debido a la variable created_comment pasada en el disparador: no es "completa". Quiero decir que el modelo tiene algunos atributos como "id" o * "created_on" * que no están definidos. Estos atributos se calculan desde el lado del servidor, pero pensé que si pasaba wait = true, esperaría y actualizaría mi modelo con la respuesta dada por el servidor (cuando se realiza una solicitud POST al servidor, devuelve el nuevo modelo creado en json)

¿No debería mi modelo tener también los atributos del lado del servidor? ¿Es el enfoque correcto para tal cosa? En caso de que no lo sea, ¿cómo puedo tener 2 métodos diferentes para mostrar una vista de colección?

¡Gracias!

Respuesta

14

create sigue siendo asíncrono incluso si pasa { wait: true }. La diferencia es sin wait, el modelo se agregará a la colección inmediatamente, mientras que con wait, la red troncal no lo agregará a la colección hasta que el servidor responda con éxito.

Lo que debe hacer es agregar una devolución de llamada correcta al create que desencadena el evento en la respuesta del servidor.

var created_tweet = this.collection.create(newTweet, { silent: true, wait: true, success: this.successCallback }); 

// Add successCallback as a method to the collection 
successCallback: function(collection, response) { 
    // I'm not 100% positive which values are passed to this function. Collection may actually be the new model. 
    this.collection.trigger("posted_new_tweet", created_tweet); 
} 
+0

Así es :) ¡Gracias! – fiunchinho

+0

Creo que en las versiones posteriores de Backbone, los argumentos ahora son 'nextModel' y' response'. – IanS

Cuestiones relacionadas