You must write your own binding handler so that your observable property is associated with the CKEditor instance.
First you can start with the custom binding found here . One of the posts contains a user binding, although I'm not sure if it works. You must check. I copied it here, loans do not suit me, of course:
ko.bindingHandlers.ckEditor = { init: function (element, valueAccessor, allBindingsAccessor, viewModel) { var txtBoxID = $(element).attr("id"); var options = allBindingsAccessor().richTextOptions || {}; options.toolbar_Full = [ ['Source', '-', 'Format', 'Font', 'FontSize', 'TextColor', 'BGColor', '-', 'Bold', 'Italic', 'Underline', 'SpellChecker'], ['NumberedList', 'BulletedList', '-', 'Outdent', 'Indent', '-', 'Blockquote', 'CreateDiv', '-', 'JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock', '-', 'BidiLtr', 'BidiRtl'], ['Link', 'Unlink', 'Image', 'Table'] ]; // handle disposal (if KO removes by the template binding) ko.utils.domNodeDisposal.addDisposeCallback(element, function () { if (CKEDITOR.instances[txtBoxID]){ CKEDITOR.remove(CKEDITOR.instances[txtBoxID]); } }); $(element).ckeditor(options); // wire up the blur event to ensure our observable is properly updated CKEDITOR.instances[txtBoxID].focusManager.blur = function () { var observable = valueAccessor(); observable($(element).val()); }; }, update: function (element, valueAccessor, allBindingsAccessor, viewModel) { var val = ko.utils.unwrapObservable(valueAccessor()); $(element).val(val); } }
Typical use will then be in HTML:
<textarea id="txt_viewModelVariableName" data-bind="ckEditor: viewModelVariableName"></textarea>
Secondly, you can check out the custom binding engine for TinyMCE , originally written by Ryan Niemeyer and updated by other talented people. Maybe TinyMCE might work for you instead of CKEditor?