He estado intentando crear un encuadernador de encuadernación personalizado que pueda usar para dar un comportamiento de marca de agua a los campos de entrada de texto.marca de agua de entrada de texto utilizando el encuadernador de encuadernación personalizado
Por watermark
quiero decir: añadir valores por defecto para los campos que se eliminan en el enfoque de texto, y se sustituye en la falta de definición si el campo de texto sigue vacío
He conseguido que esto funcione como se ha demostrado en este jsFiddle : http://jsfiddle.net/rpallas/nvxuw/
tengo 3 preguntas acerca de esta solución:
- ¿hay alguna manera de cambiarlo por lo que sólo tengo que declarar el valor de marca de agua de una vez? Actualmente tengo que ponerlo en el lugar donde declaro el enlace y también tengo que inicializar el observable con el mismo valor en viewModel, ya que de lo contrario no tendría valor inicial.
- ¿Hay alguna manera mejor de llegar al observable subyacente al que está obligado el valor de los elementos? Actualmente estoy agarrándolo usando allBindingsAccessor, pero esto me parece incorrecto. Originalmente solo estaba estableciendo el valor usando jquery
$(element).val('')
, pero esto también me pareció incorrecto. ¿Cuál es el mejor, o hay una mejor manera? - ¿Alguien tiene o conoce una solución existente para este problema? ¿Estoy reinventando la rueda?
Sí, eso es casi exactamente lo que tenía antes de cambiarlo para utilizar allBindingsAccessor. Me faltaba el 'setTimeout' cuando intento establecer el valor inicial. ¿Podría explicar brevemente por qué es necesario? Además, ¿sabes si hay una mejor manera? ¿o crees que esta es una buena (suficiente) forma (en términos de toda la solución)? Por ejemplo, noto que hay un enlace hasfocus (incorporado). ¿Podría ser ese un mejor enfoque? – Robbie
Creo que este enfoque está bien si quieres admitir navegadores más antiguos. Para los nuevos simplemente use el atributo marcador de posición. El setTimeout es necesario porque internamente KO usa setTimeout antes de establecer el valor de la entrada. Esto significa que su código se estaba ejecutando antes de que el código KO establezca el valor, por lo tanto, necesita el setTimeout para asegurarse nuevamente de que su código sea el último en la ejecución. – madcapnmckay
Muchas gracias por la explicación y ayuda. – Robbie