¿Cómo forzar una actualización de vista sin que se active automáticamente desde un observable?

151

Nota: esto es principalmente para depurar y comprender KnockoutJS.

¿Hay alguna manera de solicitar explícitamente que Knockout actualice la vista desde el modelo de vista (ya vinculado)? Estoy buscando algo como:

ko.refreshView();

Entiendo que este no es un uso previsto de Knockout, pero aún quiero saber si existe un método para la depuración y el aprendizaje.

THX-1138
fuente

Respuestas:

252

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

RP Niemeyer
fuente
55
También puede iterar sobre el contexto de datos, buscando elementos que tengan una valueHasMutatedpropiedad de tipo functiony llamándolo para cada uno de ellos. Eso debería obtener todos sus observables, pero es una mala práctica y posiblemente dispare muchas más actualizaciones de las que anticipa (piense en las cadenas de dependencia calculadas).
Patrick M
Seguro que sería bueno si no fuera por nada más: pruebas en cromo.
Scott Romack
Su viewModel puede, en sí mismo, ser observable, por lo que puede llamar myViewModel.valueHasMutated()para actualizar toda la vista.
Roy J
2
Tampoco funciona en matrices aquí. De hecho, las matrices no parecen funcionar en absoluto en Knockout. Echo de menos Angular :-(
garryp
2
Funciona en KnockoutObservableArrays a partir de KO 3.5
balint
25

En algunas circunstancias, puede ser útil simplemente eliminar los enlaces y luego volver a aplicar:

ko.cleanNode(document.getElementById(element_id))
ko.applyBindings(viewModel, document.getElementById(element_id))
ProfNimrod
fuente
Gracias por la edición de ebram ... Supongo que debería haber mencionado que uso coffeescript ;-)
ProfNimrod
15
Tenga cuidado si también usa jQuery (por ejemplo, cuando migra bits de la aplicación a ko) ya que cleanNode también eliminará otros eventos dom.
Dan Revell
Esto es perfecto. No puedo hacer que KO reconozca NUEVOS hijos dom con atributos de enlace de datos después de que se haya aplicado un modelo de vista.
Andrew T Finnell
¡Perfecto! ¡Trabajando!
jeff_drumgod
0

He creado un JSFiddle con mi controlador de enlace de eliminación de bindHTML aquí: https://jsfiddle.net/glaivier/9859uq8t/

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

Si usa esto, cambie sus enlaces a esto:

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

OR

<!-- ko bindHTML: htmlValue --><!-- /ko -->
James 'Fluffy' Burton
fuente