2011-08-24 8 views
20

Tengo una entrada oculta y ato el valor a una propiedad observable de mi modelo. Estoy usando otro complemento que actualiza internamente el valor de esa entrada oculta, sin embargo, el observable no actualiza su valor.Cómo forzar a un observable a leer el valor del elemento DOM

¿Cómo puedo forzar el observable para actualizar su valor del elemento?

algo así como valueHasMutated pero en el otro sentido.

Gracias

+1

He resuelto el problema creando un enlace personalizado que actualiza el valor de cuando el complemento cambia el valor. Básicamente es la misma tecnología explicada aquí: http://stackoverflow.com/questions/6612705/knockout-with-jquery-ui-datepicker –

+0

¡excelente! Si puede, debe responder esta pregunta con su solución y aceptarla para que otros que tengan el mismo problema puedan ver cómo la resolvió. –

+0

@Hugo - deberías publicar eso como una respuesta ... ¡así que ayuda a otros a encontrar esta pregunta en el futuro! –

Respuesta

23

Me doy cuenta de que ya ha encontrado una solución.

Pero pensé que publicaría la mía en caso de que alguien se encuentre con esto, ya que está muy arriba en los resultados de Google sin respuestas, por lo que podría ser útil para alguien.

ko.bindingHandlers.hiddenInputValue = { 

     init: function (element, valueAccessor) { 

      $(element).bind("change", function (event, data, formatted) { //hidden vars don't usually have change events, so we trigger $myElement.trigger("change"); 
       var value = valueAccessor(); 
       value($(this).val()); //rather than $(this).val(), might be best to pass our custom info in data 
      }); 
     }, 
     update: function (element, valueAccessor, allBindingsAccessor, viewModel) { 
      var value = valueAccessor(); 
      $(element).val(value); 
     } 

    }; 

Y el html

<input type="hidden" name="myName" id="myId" data-bind="hiddenInputValue: myModelValue" > 

Como las entradas ocultas no tienen eventos de cambio normalmente, necesitará para activar su propio evento cuando cada vez que cambia el valor, por ejemplo,

$("#myId").trigger("change"); 

No estoy seguro si esto es la mejor solución, pero lo mejor que podría venir con la escala de tiempo en el que estoy trabajando a :-) podría poner algo en el nocaut wiki si se me ocurre algo más elegante.

+1

Puede obtener la mayor parte o la totalidad de esta funcionalidad utilizando el controlador de valor incorporado ('data-bind =" value: myObservable "' y el mismo desencadenador. –

+0

Tal vez el nocaut ha sido actualizado desde que publiqué esto, la última vez que revisé debido a que las entradas ocultas no tienen un evento de cambio, por defecto, el noqueo no podría funcionar con el enlace de valor normal. ¿Funciona con el enlace de valor normal ahora? –

+1

Sí, funciona en Knockout 2.0.0 (no lo he probado en versiones anteriores) pero todavía tiene que desencadenar el cambio manualmente. –

12

Funcionó agregando $("hiddenInputId").trigger("change"); para mi caso sin agregar un ko controladores vinculantes.

Gracias!

+2

Esta debería ser la respuesta aceptada porque lo más probable es que jQuery se esté utilizando para actualizar el valor del campo escondido. Si se está utilizando otra biblioteca, entonces algo similar hecho usando esa biblioteca funcionaría. –

Cuestiones relacionadas