2011-12-16 9 views
139

Nota: esto es principalmente para depurar y comprender KnockoutJS.Cómo forzar la actualización de una vista sin que se active automáticamente desde un elemento observable?

¿Existe alguna manera de solicitar explícitamente Knockout para actualizar la vista del modelo de vista (ya encuadernado)? Busco algo como:

ko.refreshView(); 

entiendo que esto no es un uso previsto del nocaut, pero todavía quiero saber si existe un método de este tipo para fines de depuración y de aprendizaje.

Respuesta

234

No puede llamar a algo en todo el modelo de vista, pero en un observable individual puede llamar al myObservable.valueHasMutated() para notificar a los suscriptores que deben volver a evaluar. Esto generalmente no es necesario en KO, como mencionaste.

+5

También puede iterar sobre el contexto de datos, en busca de elementos que tienen una propiedad 'valueHasMutated' que es de tipo' function' y decir que es para cada uno de ellos. Eso debería obtener todos sus observables, pero es una mala práctica y es posible que genere muchas más actualizaciones de las que anticipa (piense en cadenas de dependencia computadas). –

+0

Seguro que estaría bien si no fuera por nada más: probar en Chrome. –

+9

¿También funciona en arreglos? En mi caso no. –

23

En algunas circunstancias podría ser útil para quitar simplemente los enlaces y luego volver a aplicar: manejador

ko.cleanNode(document.getElementById(element_id)) 
ko.applyBindings(viewModel, document.getElementById(element_id)) 
+0

Gracias por editar ebram ... Supongo que debería haber mencionado que uso coffeescript ;-) – ProfNimrod

+15

Tenga cuidado si también usa jQuery (por ejemplo, al migrar bits de la aplicación a ko) ya que cleanNode también eliminar otros eventos dom. –

+0

Esto es perfecto. No puedo hacer que KO reconozca NEW dom children con atributos de enlace de datos después de que se haya aplicado un modelo de vista. –

0

He creado una jsFiddle con mis bindHTML nocaut vinculante aquí: https://jsfiddle.net/glaivier/9859uq8t/

En primer lugar, guarde el controlador de enlace en su propio archivo (o uno común) e inclúyalo después de Knockout.

Si utiliza este modificador sus fijaciones a esto:

<div data-bind="bindHTML: htmlValue"></div> 

OR 

<!-- ko bindHTML: htmlValue --><!-- /ko --> 
Cuestiones relacionadas