2012-07-26 5 views
10

Aquí hay una jsFiddle para mostrar cuál es el problema:Firing evento de cambio cuando la propiedad vista nocaut modelo se actualiza

http://jsfiddle.net/boblauer/BgvV4/

Estoy tratando de disparar el evento de cambio después de un campo de texto se actualiza. Desafortunadamente, dentro del método de suscripción, el valor del cuadro de texto aún no se ha actualizado, así que cuando calculo el evento de cambio, se dispara demasiado pronto.

Necesito activar el evento de cambio porque tengo un código de terceros que está fuera de mi control y depende del evento de cambio.

¿Alguna sugerencia?

+0

¿Se está configurando el evento de cambio en código de terceros o solo se requiere que lo llame? – Tyrsius

+0

El controlador de eventos de cambio está enlazado en un código de terceros, y debo activarlo cuando mi modelo de vista actualice el valor de mi cuadro de texto. –

+0

Quizás no te estoy siguiendo. Si quiere atrapar el nuevo valor (aquel para el que se cambió), entonces el método de suscripción está bien y en su ejemplo está funcionando. Como me falta algo, ¿cuáles son tus resultados esperados? –

Respuesta

7

Una solución simple es ajustar su llamada a $ ("# text1"). Change() en un setTimeout con un tiempo de espera de 0. Eso es suficiente para permitir que la información (sincrónica) Se llama a jquery change handler.

I bifurcado su violín a demostrar: http://jsfiddle.net/SuRYa/1//

Si esto es algo que hay que hacer mucho, la mejor solución es, probablemente, para envolver este comportamiento en una costumbre de unión donde la "actualización" de devolución de llamada de la unión dispararía el evento de cambio de jquery en el elemento actualizado.

+0

No es una solución ideal, pero no estoy seguro de que exista una solución ideal, por lo que creo que esta podría ser mi mejor opción. Gracias por la sugerencia. –

0

bmode es correcto, un enlace personalizado lo hará. Aunque esta respuesta es un poco tarde, aquí está el enlace en caso de que ayude a cualquiera que lea esta publicación. Actualiza el valor del cuadro de texto usando jQuery: el DOM se ha actualizado para que el código de terceros de Bob funcione, por lo que activa el evento de cambio.

ko.bindingHandlers.valueAndFireChange = { 
    update: function(element, valueAccessor) { 
     var val = ko.unwrap(valueAccessor()); 
     if (val == undefined) return; 
     $(element).val(val); 
     $(element).change(); 
    } 
}; 

Aquí es una versión actualizada del violín de Bob mostrando esto en acción:

http://jsfiddle.net/BgvV4/17/

Me cambiaron las alertas a CONSOLE.LOG, por lo que tendrá la consola abierta para ver la información útil .

Cuestiones relacionadas