2013-08-21 17 views
7

私は、databindされているtextareaをviewModelの観測可能な値に置き換えるためにブートストラップwysiwygエディタを使用しています。編集可能なdiv要素を扱うためのノックアウトvalueUpdate

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

上記のテキストエリアは、テキストエリア内からキーが押されるたびに、対応するviewModel値を更新します。

は今テキストエリアは今、観察がKeyDownイベントに更新されていないWYSIWYGエディタ、ブートストラップ

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

に置き換えられます。

どのようにすればいいですか?

タグをdivにするためのカスタムバインディングハンドラ "htmlUpdate"を作成します。これは、入力要素を扱うvalueUpdateと同様ですか?

また、インラインHTMLをサポートする必要があります。「valueUpdate」をdiv要素を使用して再利用する方法についてのアイデアはありますか?ここで

はここでフィドル http://jsfiddle.net/cHTCq/

+0

あなたはjsfiddleの例を投稿できますか? –

答えて

7

でそのようにDIV、あなたは書式設定のボタンをクリックしたときにだけでなく、入力として、それは更新しているのcontentEditableで動作するように単純な結合である:

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;  
     } 
    } 
}; 

あなたのフィドルを使って更新しました:http://jsfiddle.net/rniemeyer/hp3K6/

+1

百万円ありがとう、それは魅力のように動作します。 –

+0

これは、キー以外の方法でコンテンツを更新すると、IEでうまくいかないようです。たとえば、execCommandを使用して編集可能なdivにリンクを作成していますが、残念ながらこれは値を更新しません。私は現在、手動でコンテンツを再びバインドせずに、これを回避する方法を探しています。 – Piercy

+0

イベントハンドラにフォーカスを当てていると修正されているようです。 ko.utils.registerEventHandler(要素、 "focus"、updateHandler); – Piercy