2011-10-26 26 views

Respuesta

15

El evento de teclado se activa y escribe en su modelo de vista, que luego activa la función de actualización del enlace personalizado. Esto está escribiendo el innerHTML de vuelta al elemento, lo que hace que pierdas el foco.

Una solución fácil es comprobar en la función de actualización si el elemento.innerHTML ya es el mismo que el valor que desea establecer.

http://jsfiddle.net/rniemeyer/JksKx/9/

ko.bindingHandlers.htmlValue = { 
    init: function(element, valueAccessor, allBindingsAccessor) { 
     ko.utils.registerEventHandler(element, "keydown", function() { 
      var modelValue = valueAccessor(); 
      var elementValue = element.innerHTML; 
      if (ko.isWriteableObservable(modelValue)) { 
       modelValue(elementValue); 
      } 
      else { //handle non-observable one-way binding 
       var allBindings = allBindingsAccessor(); 
       if (allBindings['_ko_property_writers'] && allBindings['_ko_property_writers'].htmlValue) allBindings['_ko_property_writers'].htmlValue(elementValue); 
      } 
     } 
            ) 
    }, 
    update: function(element, valueAccessor) { 
     var value = ko.utils.unwrapObservable(valueAccessor()) || ""; 
     if (element.innerHTML !== value) { 
      element.innerHTML = value; 
     } 
    } 
}; 
+0

Dos cosas me di cuenta en este contenteditable vinculante: 1. Asegúrese de que los datos -bind no está dentro del elemento con el atributo contenteditable. El elemento con contenteditable no activará el evento clave. 2. Si el usuario hace clic derecho en el elemento y pega texto, esto no actualizará el valor. haga clic en evento también debe ser asignado. Además, si utiliza botones como "negrita", haga clic en evento para vincularlo al cuerpo o algo así. –

+0

El uso del enfoque parece funcionar para eventos de clic "en negrita" y otros similares. ko.utils.registerEventHandler (elemento, "foco", updateHandler); – Piercy

3

posible que desee cambiar keydown a keyUp, pero aparte de eso funciona muy bien =)

ko.utils.registerEventHandler(element, "keyup", function() {