2011-10-26 58 views

回答

15

keyup事件觸發並寫入您的viewmodel,然後觸發自定義綁定的更新函數。這會將innerHTML寫回元素,這會導致您失去焦點。

一個簡單的解決方法是檢查更新函數,如果element.innerHTML已經與您想要設置的值相同。

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

兩件事情,我注意到在這個CONTENTEDITABLE結合:1.確保數據-bind不在具有contenteditable屬性的元素內。具有contenteditable的元素不會觸發關鍵事件。 2.如果用戶右鍵單擊元素並粘貼文本,這將不會更新值。點擊事件也應該被分配。此外,如果使用像「大膽」點擊事件按鈕應綁定到身體或類似的東西。 – 2012-10-26 12:44:49

+0

使用焦點似乎適用於「大膽」點擊事件和其他類似事件。 ko.utils.registerEventHandler(element,「focus」,updateHandler); – Piercy

3

可能要更改的keydown到KEYUP,但比其他的作品真的很好=)

ko.utils.registerEventHandler(element, "keyup", function() { 
相關問題