【问题标题】:Knockout Custom binding doesn't update淘汰赛自定义绑定不更新
【发布时间】:2013-12-17 13:01:56
【问题描述】:

我使用 TinyMCE Wysiwyg 编辑器进行了自定义数据绑定,但由于某种原因,当我选择新的文本输入时它不会更新。有些东西告诉我,也许更新应该破坏绑定只是为了重新初始化它,但我无法让它工作。

ko.bindingHandlers.tinymce = {
  init: function (element, valueAccessor, allBindingsAccessor, context) {
    var options = allBindingsAccessor().tinymceOptions || {};
    var modelValue = valueAccessor();
    var value = ko.utils.unwrapObservable(valueAccessor());
    var el = $(element)

    //handle edits made in the editor. Updates after an undo point is reached.
    options.setup = function (ed) {
      console.log(ed)
      ed.onChange.add(function (ed, l) {
        if (ko.isWriteableObservable(modelValue)) {
          modelValue(l.content);
        }
      });
    };

    //handle destroying an editor 
    ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
      setTimeout(function () { $(element).tinymce().remove() }, 0)
    });

    //$(element).tinymce(options);
    setTimeout(function () { $(element).tinymce(options); }, 0);
    el.html(value);

  },
  update: function (element, valueAccessor, allBindingsAccessor, context) {

    var el = $(element)
    var value = ko.utils.unwrapObservable(valueAccessor());
    var id = el.attr('id')
    alert("Value=" + value);

    //handle programmatic updates to the observable
    // also makes sure it doesn't update it if it's the same. 
    // otherwise, it will reload the instance, causing the cursor to jump.
    if (id !== undefined) {  // Does not work
      var content = tinyMCE.getInstanceById(id).getContent({ format: 'raw' });
      if (content !== value) {
        //el.html(value);
        el.val(value);
      }
    }
  }
};

更新部分只在第一次选择时调用一次。选择新的文本批次不会触发警报。为什么?

这里的提琴手:http://jsfiddle.net/Wf7xk/1/

【问题讨论】:

    标签: javascript jquery data-binding knockout.js tinymce


    【解决方案1】:

    它停止工作,因为在更新函数的tinyMCE.getInstanceById(id) 行中引发了异常。

    这里是固定和简化的版本:

    ko.bindingHandlers.tinymce = {
        init: function (element, valueAccessor, allBindingsAccessor, context) {
            var options = allBindingsAccessor().tinymceOptions || {};
    
            function writeModelValue(ed) {
                var modelValue = valueAccessor();
                if (ko.isWriteableObservable(modelValue)) {
                    modelValue(ed.getContent());
                }
            }
    
            //handle edits made in the editor
            options.setup = function (ed) {
                ed.onChange.add(writeModelValue); //on add undo point
                ed.onUndo.add(writeModelValue); //on undo
                ed.onRedo.add(writeModelValue); //on redo
            };
    
            $(element).tinymce(options);
    
            //handle destroying an editor 
            ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
                $(element).tinymce().remove();
            });
        },
        update: function (element, valueAccessor, allBindingsAccessor, context) {
            var value = ko.utils.unwrapObservable(valueAccessor());
            if(value !== $(element).html()) {
                $(element).html(value);
            }
        }
    };
    

    JSFiddle:http://jsfiddle.net/g23Qx/3/

    【讨论】:

    • 感谢@LostInComputer!很简单。太棒了! :)
    • 似乎编辑行为有点奇怪。当格式化粗体/斜体/下划线(可能更多)并使用左/右箭头键时,光标会跳转到文本的开头。初始化部分是否缺少某些内容?
    • 已修复。仅当值与当前值不同时才更新值
    • 修复了箭头键,但没有修复 CRLF 之后的格式和换行...
    • 修复了问题。原来 l.content 不等于 ed.getContent()!
    猜你喜欢
    • 1970-01-01
    • 2016-10-25
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多