2011-08-09 12 views
6

Solo me preguntaba sobre la mejor manera de suscribirme a mi almacén de datos CouchDB, de modo que si se actualiza un documento en el sofá, la vista KO también se actualizará (automágicamente). ¿Es esto algo que incluso es posible?Usando Knockout.js con CouchDB - actualizando cuando se cambió

Debajo está lo que tengo hasta ahora, que simplemente obtiene el nombre de usuario del documento user_info.

$.getJSON('http://localhost/couchdb/user_info', function(data) { 
    var viewModel = ko.mapping.fromJS(data); 
    ko.applyBindings(viewModel);  
}); 

¡Cualquier ayuda sería muy apreciada!

+1

El viewmodel se puede actualizar a través de JSON utilizando el complemento de asignación. ver http://knockoutjs.com/documentation/plugins-mapping.html en su caso será ko.mapping.fromJS (data, this.ArrayOfModels) en la devolución de llamada getJson – Martijn

+0

@Martijn, gracias por eso, lo actualicé por publicación original. Aunque, esto aún no resuelve el problema, cuando el documento user_info se actualiza (por otro usuario, o algo similar) ese objeto viewModel no se actualiza (excepto mediante una actualización de página) – crawf

+0

Desea enviar datos desde el servidor para el cliente? en una plataforma de Windows usaría setTimeOut para buscar nuevas actualizaciones regualry. Sin embargo, ahora es un proyecto muy interesante. (Http://www.nowjs.com/) Si tiene la posibilidad de usar esa plataforma, puede escribir: now.receiveMessage = function (data) { ko.mapping.updateFromJS (modelo de vista, datos); }; – Martijn

Respuesta

5

CouchDB admite notificaciones cuando cambian los documentos: changes feed.

puede sondear alimentan a los cambios, con un parámetro ?since=X para recibir sólo las actualizaciones desde X.

Usted también puede "larga sondeo" la alimentación mediante la adición de &feed=longpoll. Si aún no hay cambios, CouchDB recibirá su consulta pero no responderá hasta que finalmente se produzca un cambio.

O bien, puede tener un feed completo al estilo COMET al agregar en su lugar &feed=continuous. Eso es similar a longpoll, sin embargo CouchDB nunca cerrar la conexión. Cada vez que ocurre un cambio, le enviará el JSON y luego continuará esperando.

Por último, usted puede ser notificado cuando cualquier cosa los cambios en la base de datos, o puede especificar un filtro JavaScript para funcionar en el servidor (&filter=designdoc/filtername). Solo recibirás notificaciones si el filtro lo aprueba.

+0

Gracias por sus sugerencias, estoy muy contento con el lado CouchDB de las cosas (habiendo jugado con él durante un tiempo). Curiosamente, nunca he sido capaz de lograr que la alimentación continua funcione, pero estoy usando el método de Longpoll. Estaba buscando más información sobre el lado oculto de las cosas, y ver si el modelo se puede actualizar automáticamente cuando se cambia su fuente (CouchDB). Sin embargo, ya he escrito el código para hacerlo manualmente. ¡Gracias por la publicación detallada! – crawf

+0

La razón más probable por la que el feed continuo no funcionaría es que la biblioteca del cliente que está utilizando para leerlo no le devuelve un valor hasta que la respuesta del servidor sea * completa *; por definición & feed = continuous is * never * complete . – natevw

+0

Buen punto, y aunque no soy un experto en aplicaciones para el usuario, entiendo que la única forma de trabajar con una respuesta parcial es mediante el uso de XMLHttpRequest directamente. – JasonSmith

1

¿Has mirado http://hood.ie/ funciona bien? También estoy ejecutando hoodie como un servicio os_daemons dentro de mi couchdb.

Es agradable.

Cuestiones relacionadas