KnockoutJS と CKEditor が関係する状況があります。
基本的に、サイトの一部は「シングル ページ」アプリ スタイルです。現在は 2 ページしか含まれていませんが、時間の経過とともに拡大する可能性があります。現在は、「リスト」ページとアイテムの「管理」ページにすぎません。リスト。
管理ページ自体には、ある種のリッチ テキスト エディターが必要です。会社全体のソリューションとして CKEditor を使用しました。
これらの 2 つのページは「単一ページ」スタイルであるため、明らかに CKEditor は管理要素に対して登録できません。これは、ページの読み込み時に存在しないためです。修正するのに十分な単純な問題です。サンプルとして、クリック イベントに CKEditor をアタッチしました。次の問題は、セットアップされた Knockout オブザーバブルが更新されないことでした。これは、CKEditor が実際に添付されているテキスト領域を変更せず、実際に編集するこれらすべての div/html 要素を作成するためです。
少しグーグルで調べた後、TinyMCEでこれを行っている人の例を見つけました-http ://jsfiddle.net/rniemeyer/GwkRQ/なので、これに似たものをCKEditorに適応できると思いました。
現在、私は実用的な解決策にかなり近づいています。この手法を使用して正しいオブザーバブルを初期化および更新し(コードを最後に投稿します)、サーバーに正しく投稿することさえできました-素晴らしいです。
私が現在経験している問題は、'Single Page' アプリ部分と CKEditor の再初期化にあります。
基本的に何が起こるかは、リストからクリックして管理し、保存して(リストページに戻る)、別の「管理」に移動すると、CKEditorが初期化されますが、値がありません。チェックしました更新コード (以下) と「値」には間違いなく正しい値がありますが、CKEditor 自体にプッシュされていません。
おそらく、CKEditor のフロー/初期化プロセスに関する理解の欠如、またはノックアウト バインディングに関する理解の欠如、または単一ページ アプリ用にセットアップされたフレームワークの問題である可能性があります。よくわかりません。
コードは次のとおりです。
//Test one for ckeditor
ko.bindingHandlers.ckeditor = {
init: function (element, valueAccessor, allBindingsAccessor, context) {
var options = allBindingsAccessor().ckeditorOptions || {};
var modelValue = valueAccessor();
$(element).ckeditor();
var editor = $(element).ckeditorGet();
//handle edits made in the editor
editor.on('blur', function (e) {
var self = this;
if (ko.isWriteableObservable(self)) {
self($(e.listenerData).val());
}
}, modelValue, element);
//handle destroying an editor (based on what jQuery plugin does)
ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
var existingEditor = CKEDITOR.instances[element.name];
existingEditor.destroy(true);
});
},
update: function (element, valueAccessor, allBindingsAccessor, context) {
//handle programmatic updates to the observable
var value = ko.utils.unwrapObservable(valueAccessor());
$(element).html(value);
}
};
したがって、HTML では、ViewModel の初期化時にバインディングを適用するのは、かなり標準的なノックアウト 'data-bind: ckeditor' です。
デバッガーを入れました。フローを確認するためのコードでは、最初に読み込むときに init を呼び出してから更新し、2 回目に行って ko.utils.domNodeDisposal にヒットして要素を破棄するように見えます。
私はそれを破壊しないようにしましたが、CKEditor はその名前で何かが既に存在すると不平を言います。私はそれを破棄せず、存在するかどうかを確認し、存在しない場合は初期化しようとしました.1回目は機能しますが、2回目はCKEditorがありません。
それを機能させるために欠けているものが1つだけあると思いますが、すべてのオプションを使い果たしました。
これら3つのことを統合することについて、私を助けることができる知識を持っている人はいますか?
私を助けてくれるノックアウトの専門家はいますか?
どんな助けでも大歓迎です。
MD