2011-04-14 18 views
9

He estado jugando con KnockoutJS y me encanta cuánto simplifica el diseño desde todos los ángulos evitando que las cosas caigan por las grietas. Mi pregunta es ¿cuál es la "mejor práctica" recomendada para guardar los datos en el servidor? Según tengo entendido, en un MVVM conectado, la primera "M" es la capa de datos, por lo que el seguimiento de la dependencia y las notificaciones en el desencadenante ViewModel se guardan directamente en la capa de datos. En una aplicación de JavaScript, estamos desconectados y volvemos a guardar selectivamente en el servidor usando AJAX.¿La mejor manera de guardar los cambios en la aplicación web MVVM/Knockoutjs?

La aplicación en la que actualmente la uso es MVC3 y obtengo absolutamente cómo escribir una acción de "Guardar" en mi controlador, despliego un botón "Guardar" en algún lugar de mi página, publico todo el modelo de visualización para esa acción Guardar y luego persistir eso a la base de datos. Pero, ¿qué pasa cuando haces una edición rápida y luego la guardas de nuevo? ¿O qué pasa si un botón de guardar no se ajusta al flujo del diseño? En su lugar, ¿desea publicar en la acción cada vez que se realiza un cambio en el formulario sin ningún botón de guardar? Las ideas que he rebotado son:

  • Publique todo el modelo de vista cada vez que se realice algún cambio y haga que la acción descubra qué es nuevo y qué no (ideal, especialmente para modelos grandes, si nada de lo contrario, porque los datos transmitidos en cada guardado serían innecesariamente grandes).
  • Agregue una propiedad a cada elemento en el ViewModel que rastrea si es nuevo o ha cambiado desde la última vez que guardó. Luego, extraiga esos elementos y publíquelos solo en el servidor (no lo he probado, pero supongo que esto se puede hacer usando la propiedad _destroy, como se pretende para una aplicación de Rails).
  • Separe en tantos ViewModels más pequeños como sea plausible para que cualquier dolor de las dos primeras opciones se minimice (esto probablemente debería hacerse independientemente).
  • ¿Alguna otra manera mejor?

Tengo la esperanza de que hay algunas buenas ideas que no he pensado. Para poder enlazar declarativamente todo Y aún guardar eficientemente, sería increíble.

+0

Usted está fusionando MVC (como en ASP.NET MVC) y MVVM. Ambos son esencialmente el mismo patrón, pero MVVM tiene cambios específicos para el diseño en contra de las aplicaciones WPF. – Will

+0

En realidad KnockoutJS (http://knockoutjs.com) utiliza el patrón MVVM, que es a lo que se refería el póster también. –

+0

¡Increíble pregunta!La misma pregunta sin Knockout quizás sea aún más útil, ya que es solo uno de muchos, muchos frameworks JS por ahí. Continuaré mi búsqueda de la respuesta a esta pregunta. – noocyte

Respuesta

0

La única otra cosa que pude pensar es subscribing. Cuando comencé a leer tu publicación, estaba pensando en flags w/grep.

Editar: Mejor aún, ko.utils.compareArrays parece prometedor.

Here's un ejemplo de trabajo ..

El único que queda por hacer es detectar cambios en los valores de los valores 'retenido'. Aunque estás en camino.

+0

Wow. +1 para la implementación elegante y voy a seguir adelante y marcar esto como la respuesta por ahora. La pregunta era de naturaleza más teórica, por lo que estoy seguro de que todavía hay otros métodos, pero la forma en que se configura ese ejemplo es genio. Aunque todavía hay un botón de guardar en esa implementación, la parte genial es que no tiene que ser así. Siempre que algo desencadene ko.utils.compareArrays, podría publicar selectivamente solo las matrices que le interesan. Que es exactamente por lo que sentía curiosidad. Bien hecho. Gracias por tu contribución. – Jorin

+0

me alegro de poder ayudar. –

+3

El enlace de ejemplo está roto ... ¿hay alguna posibilidad de que el ejemplo siga disponible? Tengo un modelo de vista que tiene varios niveles de relaciones y he estado buscando diferentes opciones para guardar – littlechris

5

Acabo de volver de Mix11 donde asistí a this session sobre Knockout.js. Puede valer la pena ver a Steve Sanderson poner en marcha una demo CRUD completa.

+3

Sí, realmente vi esa demo magistral la semana pasada tan pronto como se publicó en línea. Una demostración realmente genial que muestra lo que Knockout puede hacer en el lado del cliente, pero cuando lo envió al servidor, no hizo nada, salvo transmitirlo nuevamente al cliente para mostrar que en realidad iba al servidor. Estoy más interesado en cuál es la mejor práctica al guardar cambios incrementales en el servidor ... mientras mantengo la carga útil pequeña y el controlador eficiente. – Jorin

Cuestiones relacionadas