Knockout.js 在WYSIWYG中删除自定义绑定重置光标

Knockout.js 在WYSIWYG中删除自定义绑定重置光标,knockout.js,wysiwyg,jwysiwyg,Knockout.js,Wysiwyg,Jwysiwyg,我遇到了一个涉及KnockoutJS和jwysiwyg插件()的情况。我正在使用下面所示的自定义绑定。但是,每当用户将文本更新到第二行时,通过绑定更新内容会导致光标重置到编辑器的最开头。因此,每当用户在更新后暂停键入超过1秒时,他们都会被迫单击返回到以前的位置继续 ko.bindingHandlers.wysiwyg = { init: function (element, valueAccessor, allBindingsAccessor) { var

我遇到了一个涉及KnockoutJS和jwysiwyg插件()的情况。我正在使用下面所示的自定义绑定。但是,每当用户将文本更新到第二行时,通过绑定更新内容会导致光标重置到编辑器的最开头。因此,每当用户在更新后暂停键入超过1秒时,他们都会被迫单击返回到以前的位置继续

    ko.bindingHandlers.wysiwyg = {
        init: function (element, valueAccessor, allBindingsAccessor) {
        var options = allBindingsAccessor().wysiwygOptions || {};
        var value = ko.utils.unwrapObservable(valueAccessor());
        var $e = $(element);
        $.extend(true, {
            initialContent : value
        }, options);

        $e.wysiwyg(options);

        //handle the field changing
        function detectFn() {
            var observable = valueAccessor();
            var newvalue = $e.wysiwyg("getContent");
            observable(newvalue);
        }

        var current = $e.wysiwyg('document');
        var timer;
        current.bind({    
            keyup: function(){
                clearTimeout(timer);
                timer = setTimeout(detectFn, 1000);
            }
        });

        //handle disposal (if KO removes by the template binding)
        ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
            $e.wysiwyg('destroy');
        });
    },
    update: function (element, valueAccessor) {
        var value = ko.utils.unwrapObservable(valueAccessor());
        $(element).wysiwyg("setContent", value);
        ko.bindingHandlers.value.update(element, valueAccessor);
    }
};
(然后由本公司使用绑定)


更新完成后,如何获取插入符号位置以恢复光标?或者有什么其他解决方案可以在更新时强制光标不移动

编辑:一个jsfiddle来演示这个问题。
请注意,当您在第二行或更远处键入时,会发生什么情况,然后暂停一秒钟,导致光标重置。

以下是您看到的内容:

  • 用户在所见即所得编辑器中键入一些文本
  • 用户停止键入,1秒后超时,触发detectFn
  • detectFn从WYSIWYG编辑器中获取新值并更新您的可观测值
  • 被更新的可观察对象将触发自定义活页夹上的更新方法
  • 自定义绑定器上的update方法从可观察对象获取值,并在WYSIWYG编辑器上进行设置
  • WYSIWYG编辑器设置了一个新值,将光标移动到顶行
  • 您可以通过在步骤5的中间停止事情来修复这一点,并且只在WYSIWYG编辑器中更新值,如果它与可观察到的值不同,也就是说,如果可观察到的是从WYSIWYG编辑器以外的某处更新的。 将更新方法更改为:

    update: function (element, valueAccessor) {
        var newValue = ko.utils.unwrapObservable(valueAccessor());
        var oldValue = $(element).wysiwyg("getContent");
        if (newValue !== oldValue) {
            $(element).wysiwyg("setContent", newValue);
        }
        // ko.bindingHandlers.value.update(element, valueAccessor);
    }
    
    我注释掉了该方法的最后一行。。。这似乎是无关的,我真的不知道它为什么会在那里

    此外,这些代码行似乎也没有做任何事情:

    $.extend(true, {
        initialContent : value
    }, options);
    
    我认为您正在尝试将initialContent属性添加到options对象。这可以通过以下方式实现:

    $.extend(options, {initialContent: value});
    
    然而,即使这样也不需要,因为update方法是在init方法之后调用的,并且来自observable的值在那时被加载到WYSIWYG编辑器中

    下面是对更新代码的修改:

    $.extend(options, {initialContent: value});