Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 敲除定制装订不';t更新_Javascript_Jquery_Data Binding_Knockout.js_Tinymce - Fatal编程技术网

Javascript 敲除定制装订不';t更新

Javascript 敲除定制装订不';t更新,javascript,jquery,data-binding,knockout.js,tinymce,Javascript,Jquery,Data Binding,Knockout.js,Tinymce,我用TinyMCE Wysiwyg编辑器定制了这个数据绑定,由于某种原因,当我选择一个新的文本输入时,它不会更新。有些东西告诉我,也许更新应该销毁绑定,只是为了重新初始化它,但我无法让它工作 ko.bindingHandlers.tinymce = { init: function (element, valueAccessor, allBindingsAccessor, context) { var options = allBindingsAccessor().tinymceOp

我用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);
      }
    }
  }
};
对于第一个选择,只调用一次更新部分。选择新文本批次不会触发警报。为什么?


Fiddler here:

它停止工作,因为更新函数的
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);
        }
    }
};

JSIDLE:

Thanx@LostInComputer!这么简单。太棒了!:)然而,编辑的行为似乎有点奇怪。设置粗体/斜体/下划线(可能更多)格式并使用左/右箭头键时,光标会跳到文本的开头。初始化部分是否缺少某些内容?已修复。仅当值与修复箭头键的当前值不同时才更新该值,但CRLF后的格式和换行…修复了该问题。原来l.content不等于ed.getContent()!