2011-10-26 4 views

risposta

15

L'evento keyup viene attivato e scritto sul viewmodel, che attiva la funzione di aggiornamento dell'associazione personalizzata. Questo sta riportando l'innerHTML all'elemento, il che sta causando la perdita di concentrazione.

Una soluzione semplice consiste nel controllare la funzione di aggiornamento se l'elemento.innerHTML è già uguale al valore su cui si desidera impostarlo.

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

Due cose che ho notato in questa contenteditable vincolante: 1. Assicurarsi che i dati -bind non è all'interno di un elemento con attributo contenteditable. L'elemento con contenteditable non attiva l'evento chiave. 2. Se l'utente fa clic destro su elemento e incolla il testo, questo non aggiornerà il valore. anche l'evento click dovrebbe essere assegnato. Inoltre, se si utilizzano pulsanti come "grassetto", l'evento click deve essere associato al corpo o qualcosa del genere. –

+0

L'utilizzo della messa a fuoco sembra funzionare per eventi di clic "in grassetto" e altri simili. ko.utils.registerEventHandler (elemento, "focus", updateHandler); – Piercy

3

potrebbe desiderare di cambiare keydown a keyup, ma a parte questo funziona davvero bene =)

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