4

所以我试图让淘汰赛与summernote一起玩得很好,但这并没有真正奏效。我意识到这是因为summernote 使用a<div contenteditable>而不仅仅是一个输入字段。

我的绑定是这样的:

ko.bindingHandlers.summernote = {
    init: function (element, valueAccessor) {
        var options = valueAccessor();
        $(element).summernote(options);
    }
};

显然,仅使用 contenteditable 淘汰赛并不能很好地工作,那我该怎么办?

4

7 回答 7

4

采取其他一些答案并使它们适用于当前版本的summernote 我做了以下工作:

需要注意的一点:这个 bindinghandler 也适应来自 viewModel 的入站更改。

 ko.bindingHandlers.wysiwyg = {
    init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
        var value = ko.unwrap(valueAccessor());
        var allBindings = ko.unwrap(allBindingsAccessor())
        var optionsBinding = allBindings.wysiwygOptions || {};
        var $element = $(element);
        var options = $.extend({}, optionsBinding);

        var updateObservable = function (e) {
            valueAccessor($element.summernote('code'));
            return true;
        };

        options.callbacks = {};
        options.callbacks.onKeyup = options.callbacks.onFocus = options.callbacks.onBlur = updateObservable;

        $element.html(value).summernote(options);
    },
    update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
        var value = ko.unwrap(valueAccessor());
        $(element).summernote('code', value);
    }
};

一些选项已更改,您不必调查事件 dom 数据。此外,我不需要同时更新 keyDown 和 keyUp,所以我的事件列表有点不同。而且我的绑定处理程序不是“summernote”,以便将来更灵活地进行更改。这只是所见即所得。YMMV

于 2016-01-29T22:47:01.447 回答
3

实际上,我开始更多地考虑这一点,并决定发布我自己的解决方案,因为谷歌上没有其他任何东西。我所做的只是将上述绑定更改为:

ko.bindingHandlers.summernote = {
    init: function (element, valueAccessor, allBindingsAccessor) {
        var options = valueAccessor();
        var binding = ko.utils.unwrapObservable(allBindingsAccessor()).value;

        var updateObservable = function(e) {
            binding(e.currentTarget.innerHTML);
        };

        options.onkeydown = options.onkeyup = options.onfocus = options.onblur = updateObservable;

        $(element).summernote(options);
    }
};

只需观看 blur / focus / keypress / keyrelease 事件就足以更新 observables。它并不完美,但它有效。

于 2014-05-02T19:54:29.740 回答
3

我正在使用以下双向绑定,它对我有用......

淘汰赛绑定(在 CoffeeScript 中):

ko.bindingHandlers.summernote =
    init: (element, valueAccessor, allBindingsAccessor) ->
        options = valueAccessor()      
        options.toolbar = [    
            ['style', ['bold', 'italic', 'underline', 'clear']],            
            ['fontsize', ['style']],            
            ['para', ['ul', 'ol', 'paragraph']],
            ['table', ['table']],            
            ['misc', ['codeview']],
        ]

        options.onblur = () -> valueAccessor() $(element).code()                      
        $(element).summernote(options) 

    update: (element, valueAccessor, allBindingsAccessor) ->
        $(element).code(ko.utils.unwrapObservable(valueAccessor()))

HTML 中的用法:

<textarea data-bind="summernote: Content"></textarea>
于 2014-05-17T01:21:40.543 回答
3

我的解决方案是听onChange事件

ko.bindingHandlers.summernote = {
    init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
        var value = ko.unwrap(valueAccessor());
        var $element = $(element);
        $element.html(value).summernote({
            onChange: function (contents) {
                valueAccessor()(contents);
            }
        });
    }
};

编辑

在 v0.7.0 之后,每个回调都应该被回调对象包裹。

ko.bindingHandlers.summernote = {
    init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
        var value = ko.unwrap(valueAccessor());
        var $element = $(element);
        $element.html(value).summernote({
            callbacks:{ // added for V0.7.0
                onChange: function (contents) {
                    valueAccessor()(contents);
                }
            }
        });
    }
};
于 2015-05-28T04:15:51.940 回答
2

对先前答案的小修复和更改:

  1. 在使用工具栏的某些情况下会出现一个小故障。要解决此问题,必须在通过模糊事件发生时阻止更新。
  2. 还添加了通过元素上的“summerOptions”属性覆盖选项的能力。

这是我的更新:

ko.bindingHandlers.summernote = new function () {
    var isblur = false;

    this.init = function (element, valueAccessor, allBindings) {
        var value = valueAccessor();
        var options = $.extend(value, {
            height: 100,
            toolbar: [
                ["style", ["bold", "italic", "underline", "clear"]],
                ["fontstyle", ["style"]],
                ["fontsize", ["fontsize"]],
                ["lists", ["ul", "ol", "paragraph"]],
                ["links", ["link", "picture"]],
                ["misc", ["fullscreen", "codeview"]]
            ],
            onblur: function () {
                isblur = true;
                value($(element).code());
                isblur = false;
            }
        });
        $.extend(options, allBindings.get("summerOptions"));
        return $(element).summernote(options);
    };
    this.update = function (element, valueAccessor) {
        if (!isblur) {
            var value = valueAccessor();
            $(element).code(value());
        }
    };
};

以及用法:

<textarea data-bind="summernote: Content"></textarea>

或使用选项覆盖:

<textarea data-bind="summernote: Content, summerOptions: { height: 200 }"></textarea>
于 2014-10-17T13:04:00.583 回答
0
ko.bindingHandlers.summernote = {
    init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
    var value = ko.unwrap(valueAccessor());
    var $element = $(element);
    $element.html(value).summernote({
         callbacks:{
        onChange: function (contents) {
            valueAccessor()(contents);
        }
   }
  });
 }
};
于 2017-03-09T05:24:41.483 回答
0

使用这个解决方案,它对我有用

ko.bindingHandlers.summernote = {
        init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
            var value = ko.unwrap(valueAccessor());                
            var allBindings = ko.unwrap(allBindingsAccessor())
            var optionsBinding = allBindings.summernoteOptions || {};
            var $element = $(element);
            var options = $.extend({}, optionsBinding);

            var updateObservable = function (e) {
                valueAccessor()($element.summernote('code'));
                return true;
            };

            options.callbacks = {};
            //options.callbacks.onFocus = options.callbacks.onBlur = updateObservable;

            $element.html(value).summernote(options);

            $(element).next().find('.note-editable').keyup(updateObservable);
            $(element).next().find('.note-editable').bind('DOMNodeInserted DOMNodeRemoved', updateObservable);
        },
        update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
            var value = ko.unwrap(valueAccessor());
            if (value != $(element).summernote('code')) {
                $(element).summernote('code', value);
            }                
        }
    };
于 2018-07-27T19:14:13.237 回答