这是使用自定义绑定的真正用例。<textarea>
我用这种方法成功地实现了 TinyMCE 。
您正在观察的问题是您通过单击工具栏上的按钮进行的操作正在引发事件,这会在不触发事件的情况下Markdown.Editor
改变底层的值,当然 Knockout 依赖于它来通知它的订阅者。<textarea>
change
我的解决方案实现了自定义绑定,以确保所见即所得编辑器引发的事件反映在视图模型中。具体来说,要确保该值始终是最新的,并dirty
在视图模型中维护一个标志。由于我不熟悉 Markdown 插件,因此我包含了一个取自我的 TinyMCE 解决方案的示例。原理完全相同,您只需要应用 Markdown 编辑器的细节即可。
ko.bindingHandlers.wysiwyg = {
init: function(element, valueAccessor, allBindingsAccessor, viewModel) {
$(element).tinymce({
/*** other options excluded for brevity ***/
setup: function(editor) {
editor.on('change', function() {
valueAccessor()(editor.getContent());
viewModel.isDirty = editor.isDirty();
});
}
});
},
update: function(element, valueAccessor) {
$(element).text(valueAccessor()());
}
};
最后,您的绑定现在可以按如下方式实现;
<textarea data-bind="value: content, wysiwyg: content"></textarea>
更新
自从在 PageDown 上阅读以来,这里是从您的JSFiddle的分支中获取的自定义绑定
ko.bindingHandlers.wysiwyg = {
init: function(element, valueAccessor, allBindingsAccessor, viewModel) {
editor.hooks.chain("onPreviewRefresh", function () {
$(element).change();
});
editor.run();
}
};