Сбой пользовательской привязки для cleditor после сортировки элементов с помощью сортировки нокаутом

Прежде всего: проверьте эту скрипту.

У меня есть сортируемый массив элементов, созданный с помощью сортируемой библиотеки Knockout. Когда я изначально применяю привязку, cleditor инициализируется нормально.

Однако, когда сортируемые элементы сортируются, cleditor не может повторно инициализироваться (я не уверен, что происходит, но cleditor терпит неудачу). cleditor просто отображает «true» вместо фактического значения в Firefox и ничего во всех других браузерах.

Я пытаюсь выяснить, в чем проблема, будь то пользовательская привязка, jQuery-UI или сортируемая библиотека Knockout?

Я не получаю никаких ошибок в моей консоли.

ko.bindingHandlers.cleditor = {
        init: function(element, valueAccessor, allBindingsAccessor) {

            var modelValue = valueAccessor(),
                allBindings = allBindingsAccessor();

            var $editor = jQuery(element).cleditor({
                height: 50,
                controls: "bold italic underline | bullets numbering | undo redo"
            });

            $editor[0].change(function() {

                var elementValue = $editor[0].doc.body.innerHTML;
                if (ko.isWriteableObservable(modelValue)) {
                    modelValue(elementValue);

                } else {
                    if (allBindings['_ko_property_writers'] && allBindings['_ko_property_writers'].cleditor) {
                        allBindings['_ko_property_writers'].cleditor(elementValue);
                    }
                }
            });
        },

        update: function(element, valueAccessor) {
            var value = ko.utils.unwrapObservable(valueAccessor()) || '',
                $editor = jQuery(element).cleditor();

            if ($editor[0].doc.body.innerHTML !== value) {
                //$editor[0].doc.body.innerHTML = value;
                $editor[0].doc.body.innerHTML = value;
                $editor[0].focus();
            }
        }
    };

Как я могу заставить cleditor работать даже после того, как элементы отсортированы?

Я нашел этот ресурс, но ничего плохого не нашел в коде, как сказано в этой теме.


person Jagan K    schedule 21.02.2014    source источник
comment
groups.google.com/forum/?fromgroups#!topic/cleditor/ 6W36CyPsaVU Я обнаружил, что это обсуждение точно повторяет проблему, с которой я столкнулся, но я не смог ее использовать, потому что я получаю, что Refresh() не является ошибкой функции. Я использую версию 1.4.4 cleditor.   -  person Jagan K    schedule 21.02.2014
comment
Я собрал этот пример, чтобы показать, что он не имеет ничего общего с Knockout: jsfiddle.net/mbest/rh8c2   -  person Michael Best    schedule 21.02.2014


Ответы (1)


Приведенная вами ссылка оказалась полезной. Метод CLEditor refresh — правильный способ обновить его после перетаскивания. Просто это нужно сделать в нужное время, используя сортируемое событие stop.

stop: function(event, ui) {
    $(ui.item).find("textarea").cleditor()[0].refresh();
}

http://jsfiddle.net/mbest/rh8c2/1/

Я также работал над тем, чтобы интегрировать это в вашу привязку cleditor. В функции init:

jQuery(document).on('sortstop', function(event, ui) {
    if (jQuery.contains(ui.item[0], element)) {
        jQuery(element).cleditor()[0].refresh();
    }
});

Я также внес изменение в функцию update, чтобы синхронизировать значение <textarea>, потому что refresh обновляет значение редактора из <textarea>:

$editor[0].updateTextArea();

http://jsfiddle.net/mbest/jw7Je/7/

person Michael Best    schedule 21.02.2014
comment
Миллион спасибо, я ломал голову, чтобы исправить это более 24 часов. Однако я догадался, что это должно быть на стороне кредитора. - person Jagan K; 21.02.2014