2011-10-26 13 views

Odpowiedz

15

Zdarzenie keyup uruchamia i zapisuje do swojego viewmodelu, który następnie uruchamia funkcję aktualizacji niestandardowego powiązania. To jest zapisywanie innerHTML z powrotem do elementu, co powoduje utratę fokusu.

Łatwą poprawką jest sprawdzenie funkcji aktualizacji, jeśli element.innerHTML jest już taki sam, jak wartość, którą chcesz ustawić.

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

dwie rzeczy zauważyłem na tej contentEditable wiążące: 1. Upewnij się, że dane -bind nie jest elementem wewnętrznym z atrybutem contenteditable. Element z funkcją contenteditable nie uruchomi zdarzenia kluczowego. 2. Jeśli użytkownik kliknie prawym przyciskiem myszy na element i wklei tekst, to nie zaktualizuje wartości. Zdarzenie click również powinno zostać przypisane. Również jeśli używasz przycisków takich jak "pogrubione" zdarzenie click powinno być związane z treścią lub czymś w tym stylu. –

+0

Używanie fokusu wydaje się działać w przypadku "pogrubionych" zdarzeń kliknięć i innych podobnych. ko.utils.registerEventHandler (element, "focus", updateHandler); – Piercy

3

chcieć zmienić keyDown do keyUp, ale poza tym działa bardzo dobrze =)

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