Estoy tratando de usar KnockoutJS con jQuery UI. Tengo un elemento de entrada con un selector de fecha adjunto. Actualmente estoy ejecutándome knockout.debug.1.2.1.js
y parece que Knockout nunca detecta el evento de cambio. El elemento se ve así:
<input type="text" class="date" data-bind="value: RedemptionExpiration"/>
Incluso he intentado cambiar el valueUpdate
tipo de evento pero fue en vano. Parece que Chrome causa un focus
evento justo antes de que cambie el valor, pero IE no lo hace.
¿Existe algún método de Knockout que "vuelva a unir todos los enlaces"? Técnicamente, solo necesito cambiar el valor antes de enviarlo de vuelta al servidor. Entonces podría vivir con ese tipo de solución.
Creo que el problema es culpa del datepicker, pero no puedo entender cómo solucionarlo.
¿Algunas ideas?
fuente
Aquí hay una versión de la respuesta de RP Niemeyer que funcionará con los scripts de validación de eliminación que se encuentran aquí: http://github.com/ericmbarnard/Knockout-Validation
Los cambios se realizan en el controlador de eventos de cambio para pasar primero el valor ingresado y no la fecha a los scripts de validación, luego solo se establece la fecha en observable si es válida. También agregué validationCore.init que es necesario para los enlaces personalizados que se analizan aquí:
http://github.com/ericmbarnard/Knockout-Validation/issues/69
También agregué la sugerencia de rpenrose para que el cambio se difuminara para eliminar algunos escenarios molestos de selección de fechas que se interponían en el camino de las cosas.
fuente
He usado un enfoque diferente. Dado que knockout.js no parece activar el evento en el cambio, forcé al selector de fechas a llamar a change () para su entrada una vez cerrado.
fuente
Aunque todas estas respuestas me ahorraron mucho trabajo, ninguna de ellas funcionó completamente para mí. Después de seleccionar una fecha, el valor enlazado no se actualizará. Solo pude hacer que se actualice al cambiar el valor de la fecha usando el teclado y luego haciendo clic fuera del cuadro de entrada. Arreglé esto aumentando el código de RP Niemeyer con el código de syb para obtener:
Sospecho que pongo el observable ($ (elemento) .datepicker ("getDate")); declaración en su propia función y registrar eso con options.onSelect hizo el truco?
fuente
onSelect
función, nochange
Gracias por este artículo, lo encontré muy útil.
Si desea que DatePicker se comporte exactamente como el comportamiento predeterminado de JQuery UI, le recomiendo agregar un desenfoque en el elemento en el controlador de eventos de cambio:
es decir
fuente
Resolví este problema cambiando el orden de mis archivos de script incluidos:
fuente
Igual que RP Niemeyer, pero mejor soporte de WCF DateTime, Timezones y el uso de la propiedad DatePicker onSelect JQuery.
Disfruta :)
http://jsfiddle.net/yechezkelbr/nUdYH/
fuente
Creo que se puede hacer mucho más fácil:
<input data-bind="value: myDate, datepicker: myDate, datepickerOptions: {}" />
Por lo tanto, no necesita manejo manual de cambios en la función init
Pero en este caso, su variable 'myDate' obtendrá solo un valor visible, no un objeto Date.
fuente
Alternativamente, puede especificar esto en el enlace:
Actualizar:
fuente
Basado en la solución de Ryan, myDate devuelve la cadena de fecha estándar, que no es la ideal en mi caso. Usé date.js para analizar el valor para que siempre devuelva el formato de fecha que desea. Eche un vistazo a este ejemplo de violín de ejemplo .
fuente
Necesitaba actualizar repetidamente mis datos del servidor, pero no terminé el trabajo para compartir mis necesidades a continuación (mi formato de fecha / Fecha (1224043200000) /):
Después de que el modelo se formatea correctamente para la salida, agregué una plantilla con la documentación knockoutjs :
fuente
Pocas personas pidieron opciones dinámicas de selector de fecha En mi caso, necesitaba un rango de fechas dinámico, por lo que la primera entrada define el valor mínimo del segundo y el segundo establece el valor máximo para el primero. Lo resolví extendiendo el controlador del RP Niemeyer. Entonces a su original:
He agregado dos controladores más que corresponden a las opciones que quería modificar:
Y los usé así en mi plantilla:
fuente
El uso de enlaces personalizados proporcionados en respuestas anteriores no siempre es posible. Llamar
$(element).datepicker(...)
lleva un tiempo considerable, y si tiene, por ejemplo, unas pocas docenas, o incluso cientos de elementos para llamar a este método, debe hacerlo "perezoso", es decir, a pedido.Por ejemplo, el modelo de vista se puede inicializar, el
input
correos electrónicos se insertan en el DOM, pero los marcadores de fecha correspondientes solo se inicializarán cuando un usuario haga clic en ellos.Entonces, aquí está mi solución:
Agregue un enlace personalizado que permita adjuntar datos arbitrarios a un nodo:
Use el enlace para attcah el observable utilizado para el
input
valor de 's:Y finalmente, al inicializar el selector de fechas, use su
onSelect
opción:De esta manera, cada vez que un usuario cambia la fecha con el selector de fecha, también se actualiza el observable Knockout correspondiente.
fuente