javascript - 为什么使用按钮栏时 PageDown 编辑器不触发 Knockout 值更新?

标签 javascript knockout.js custom-binding pagedown

当用户使用 PageDown 按钮栏对编辑器文本进行更改时,我无法更新挖空模型。任何打字、粘贴或剪切都可以正常工作,但按钮栏操作却不行。

我已经尝试为 onPreviewRefresh 添加一个 hook 到编辑器,但似乎永远不会触发。

这是一个Fiddle显示问题。如果您在编辑器中键入 testtest 将显示在预览部分。但是,如果您在编辑器中键入 test,然后使用菜单栏将 test 设为粗体,那么在您键入另一个字符之前,预览部分不会看到此更新。

这是我用来初始化 PageDown 编辑器的自定义绑定(bind):

var ME = {};
ME.MarkdownConverter = Markdown.getSanitizingConverter();
ME.MarkdownCounter = 0;

ko.bindingHandlers.markdownEditor = {
    init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
        ++ME.MarkdownCounter;
        // Create the elements needed for a new PageDown editor.
        $(element).append($('<div id="wmd-button-bar-' + ME.MarkdownCounter + '" class="wmd-button-bar"></div>'));
        $(element).append($('<textarea id="wmd-input-' + ME.MarkdownCounter + '" class="wmd-input"></textarea>'));

        // Make sure the textarea is properly binded up so that the view model is updated.
        var newBindings = { textInput: valueAccessor };
        ko.applyBindingAccessorsToNode($('#wmd-input-' + ME.MarkdownCounter)[0], newBindings, viewModel);

        // Create the editor and apply to the new elements ensuring that we detect all
        // changes from the wmd-button-bar.
        var editor = new Markdown.Editor(ME.MarkdownConverter, "-" + ME.MarkdownCounter);
        editor.hooks.chain("onPreviewRefresh", function () {
            var value = valueAccessor();
            debugger;
            value($('#wmd-input-' + ME.MarkdownCounter).val());
        });
        editor.run();

        return { controlsDescendantBindings: true }; 
    }
};

最佳答案

不会触发值更新,因为值是通过编程方式设置的,不会触发文本区域的更改事件。

onPreviewRefresh 事件没有被触发,因为没有预览元素。作为解决方法,您可以添加元素并将其隐藏:

var ME = {};
ME.MarkdownConverter = Markdown.getSanitizingConverter();
ME.MarkdownCounter = 0;

ko.bindingHandlers.markdownText = {
    init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
        $(element).addClass('markdown-text');
    },
    update: function(element, valueAccessor, allBindings) {
        var value = valueAccessor();
        var valueUnwrapped = ko.unwrap(value);
        $(element).html(ME.MarkdownConverter.makeHtml(valueUnwrapped));
    }
};

ko.bindingHandlers.markdownEditor = {
    init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
        ++ME.MarkdownCounter;
        // Create the elements needed for a new PageDown editor.
        $(element).append($('<div id="wmd-button-bar-' + ME.MarkdownCounter + '" class="wmd-button-bar"></div>'));
        $(element).append($('<textarea id="wmd-input-' + ME.MarkdownCounter + '" class="wmd-input"></textarea>'));        
        // if no preview element is found, onPreviewRefresh is not triggered
        $(element).append('<div style="display: none" class="wmd-panel wmd-preview" id="wmd-preview-' + ME.MarkdownCounter + '"></div>');

        var $input = $('#wmd-input-' + ME.MarkdownCounter);

        // Make sure the textarea is properly binded up so that the view model is updated.
        var newBindings = { textInput: valueAccessor };
        ko.applyBindingAccessorsToNode($input[0], newBindings, viewModel);

        // Create the editor and apply to the new elements ensuring that we detect all
        // changes from the wmd-button-bar.
        var editor = new Markdown.Editor(ME.MarkdownConverter, "-" + ME.MarkdownCounter);
        editor.hooks.chain("onPreviewRefresh", function () {
            $input.change();
        });
        editor.run();

        return { controlsDescendantBindings: true }; 
    }
};

var vm = { noteText: ko.observable('') };
ko.applyBindings(vm);

参见 http://jsfiddle.net/vaako62z/3/

关于javascript - 为什么使用按钮栏时 PageDown 编辑器不触发 Knockout 值更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26387803/

相关文章:

javascript - 模态对话框不显示

javascript - Ionic : $ionicPlatform. isIOS() 在 Controller 方法中不起作用

knockout.js - 如何使用 ko.mapping 只观察一个键

mvvm - 剑道 mvvm : how to define a custom css binding

javascript - 使用 Knockout + Typeahead 自定义绑定(bind)更新文本框中的值

javascript - setState of react 中的计算样式不起作用

javascript - 根据先前生成的父对象生成子元素

javascript - 从嵌套数据结构中删除元素

javascript - Knockout JS : Removing selected values from other, 相同的下拉菜单

javascript - 在 knockout.js 中为 nl2br 创建自定义绑定(bind)