2012-09-07 7 views
7

Básicamente quiero volver a aplicar enlaces en la misma página para los diferentes objetos, pero hay un comportamiento extraño. Después de volver a aplicar el enlace, la lista de elementos se pierde.Volver a aplicar enlaces en knockout

Por favor, vea aquí: http://jsfiddle.net/baio/9UcUs/5/

¿Qué hacer?

+0

Puede que esto no le pregunte directamente, pero un enfoque más estándar con nocaut es vincular su modelo de vista y luego modificar el contenido del modelo en lugar de cambiar todo el modelo cada vez. Ver http://jsfiddle.net/9UcUs/8/ para un ejemplo. –

+0

El código relevante siempre debe ser *** en *** la pregunta, no solo vinculado (ni siquiera jsFiddle). –

Respuesta

6

La respuesta corta es que no es compatible. La respuesta larga es que hay algunas formas de evitarlo. Una forma es llamar al cleanNode antes del applyBindings, pero esto no borra los controladores de eventos. Otra forma es envolver su modelo de vista en un observable y luego actualizarlo para volver a aplicar enlaces; esto funciona mucho mejor, pero aún tiene un pequeño problema (ver más abajo).

Aquí es su ejemplo usando el método observables vista del modelo: http://jsfiddle.net/mbest/9UcUs/9/

El único problema que he encontrado con el uso de un modelo de vista observable es que los controladores de eventos no están completamente actualizados con el nuevo modelo de vista. Llamarán a la función correcta en el nuevo modelo de vista, pero los valores this y data serán para el modelo de vista original.

Editar:

Knockout 3.0 (actualmente prevista para el lanzamiento de este mes) es totalmente compatible con modelos de vista observables. Todavía podría haber problemas con los enlaces personalizados, pero esperamos que todo esto se documente pronto.

4

puede vincular el mismo modelo de vista a diferentes elementos, debe especificar el elemento al que desea aplicar su enlace.

ko.applyBindings(vm, $('#yourul')); 

ko.applyBindings(vm, $('#div')); 
+6

recuerde que Knockout no depende de jQuery: use '$ ('# yourul') [0]' y '$ ('# div') [0]' en su lugar –

0

Haciendo:

ko.applyBindings(viewModel, $('#somejQObj')[0]); 

Obra especificada en los comentarios de respuesta de @ fengd. Actualmente, tiene una tabla que se completa con una instrucción foreach, que tiene filas expandibles en las que cada una tiene una subtabla añadida dinámicamente que también está poblada por una instrucción foreach. Después de que cada subtabla se inserta dinámicamente, lo anterior establece los enlaces para la subtabla y rellena los datos.

Cuestiones relacionadas