当用户使用 PageDown 按钮栏对编辑器文本进行更改时,我无法更新挖空模型。任何打字、粘贴或剪切都可以正常工作,但按钮栏操作却不行。
我已经尝试为 onPreviewRefresh
添加一个 hook
到编辑器,但似乎永远不会触发。
这是一个Fiddle显示问题。如果您在编辑器中键入 test
,test
将显示在预览部分。但是,如果您在编辑器中键入 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);
关于javascript - 为什么使用按钮栏时 PageDown 编辑器不触发 Knockout 值更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26387803/