salto - split javascript array
Knockout bindingHandler para nĂºmeros separados por comas con la misma entrada nuevamente en un cuadro de texto (1)
Necesitaba crear un bindingHandler Knockout que formateara la cantidad en números separados por comas. Después de buscar un poco encontré la solución aquí (gracias a @nemesv para la solución) que usa http://numeraljs.com/ para la conversión.
la carpeta es la siguiente:
ko.bindingHandlers.formatMoney = {
init: function(element, valueAccessor) {
var value = valueAccessor();
var interceptor = ko.computed({
read: function() {
return numeral(ko.unwrap(value)).format(''0,0.00'');
},
write: function(newValue) {
if($.trim(newValue) == '''')
value("0");
else
value(numeral().unformat(newValue));
}
}).extend({ notify: ''always'' });
if(element.tagName.toLowerCase() == ''input'' )
ko.applyBindingsToNode(element, {
value: interceptor
});
else
ko.applyBindingsToNode(element, {
text: interceptor
});
}
}
Lo usé y funciona perfectamente en casos normales. Pero necesito arreglarlo cuando lo uso con el cuadro de texto.
El problema es que se está utilizando un observable que normalmente solo se notifica si el valor realmente cambió. Entonces, el formateador real se aplica si escribo un valor diferente cada vez. Así por ejemplo
- si escribo 1234 por primera vez y el cuadro de texto pierde el foco, se convierte a 1,234.00.
- ahora si escribe 1234 nuevamente en el cuadro de texto. no funciona y no se llama al método de
read
la carpeta.
¿Qué tengo que hacer para que el método de read
interceptor''s
active siempre, incluso si el observable tiene el mismo valor?
Fiddle de muestra: http://jsfiddle.net/vEcSq/4/
Gracias.
Puede usar la función valueHasMutated
en el observable para alertar a los suscriptores que ha cambiado, incluso si no lo ha hecho. En la función de write
en el interceptor
, agregue la siguiente línea como la última línea de la función.
value.valueHasMutated();
He actualizado su jsfiddle con la llamada y parece estar funcionando correctamente.