2013-08-21 28 views
7

Używam edytora WYSIĄGI bootstrap do zastąpienia textarea, który jest databindowany do możliwej do zaobserwowania wartości z viewModel.Wartość KnockoutUpdate do pracy z edytowalnymi elementami div

<textarea data-bind="html:data, valueUpdate:'afterkeydown'"></textarea> 

Powyższe pole tekstowe aktualizuje odpowiednią wartość widoku Model za każdym razem, gdy naciśnięto klawisz z wnętrza ramki tekstowej.

Teraz obszar tekst otrzymuje bootstrap WYSIWYG edytor

<div class="editor" data-bind="html:data, valueUpdate:'afterkeydown'"></div> 

teraz obserwowalny nie jest aktualizowana na keydown.

jakikolwiek pomysł, jak to zrobić?

Tworzenie niestandardowego modułu wiążącego "htmlUpdate" w celu przypisania znaczników, podobnie do wartości Aktualizuj, która działa z elementami wejściowymi?

również powinna obsługiwać wbudowany HTML, Jakieś pomysły dotyczące ponownego użycia "valueUpdate" do pracy z elementami div?

Oto skrzypce http://jsfiddle.net/cHTCq/

+0

Czy możesz wysłać przykład jsfiddle? –

Odpowiedz

7

Oto prosty wiązania do pracy z contentEditable div tak i mieć go aktualizować w trakcie pisania, a także po kliknięciu przycisków formatowania:

ko.bindingHandlers.htmlValue = { 
    init: function(element, valueAccessor, allBindingsAccessor) { 
     var updateHandler = function() { 
      var modelValue = valueAccessor(), 
       elementValue = element.innerHTML; 

      //update the value on keyup 
      modelValue(elementValue); 
     }; 

     ko.utils.registerEventHandler(element, "keyup", updateHandler); 
     ko.utils.registerEventHandler(element, "input", updateHandler); 
    }, 
    update: function(element, valueAccessor) { 
     var value = ko.utils.unwrapObservable(valueAccessor()) || "", 
      current = element.innerHTML; 

     if (value !== current) { 
      element.innerHTML = value;  
     } 
    } 
}; 

Oto twoje skrzypce zaktualizowane do korzystania z niego: http://jsfiddle.net/rniemeyer/hp3K6/

+1

Milionowe dzięki, działa jak urok. –

+0

To nie działa z IE, jeśli zaktualizujesz zawartość w inny sposób niż klucz. Na przykład Im przy użyciu execCommand do tworzenia łączy w edytowalnym div, ale niestety to nie robi następnie zaktualizować wartości. Im obecnie szuka sposobu obejścia tego bez ręcznego wiązania zawartości ponownie. – Piercy

+0

Użycie fokusu do obsługi zdarzeń wydaje się go naprawić. ko.utils.registerEventHandler (element, "focus", updateHandler); – Piercy