インスタンスが完全にロードされた後、CKEditor インスタンスを「読み取り専用」に設定しようとしていますが、Javascript エラーが発生します: Cannot call method 'setReadOnly' of null
. 私がそれを掘り下げると、エラーはeditor.setReadOnly
メソッド内のckeditor.jsのこの行から発生しています:this.editable().setReadOnly(a);
つまり、エディターは存在しますが、editable
(CKEditorインスタンスの)メソッド/属性は存在しません。
以下は私のコードです。少し説明します。私のアプリは GWT と Backbone を組み合わせたものです。CKEditor 自体はバックボーン コードによって作成されますが、親要素は GWT にあるため、ここでsetEnabled
アクションを開始します。
private native void setEnabledOnLoad(boolean enabled, String id) /*-{
CKEDITOR.on("instanceReady", function(evt) {
if(evt.editor.name === id) {
Namespace.trigger(Namespace.Events.SET_ENABLED, enabled);
}
});
}-*/;
setEnabled: function(enabled) {
this.editor.setReadOnly(!enabled);
if(enabled){
this.editor.focusManager.focus();
} else {
this.editor.focusManager.blur();
}
}
Backbone クラスには、Namespace.Events.SET_ENABLED
そのトリガーのリスナーがありますsetEnabled
。
リッスンする必要がある別の CKEditor イベントはありますか? instanceReady
でのイベントはないようeditable
です。私は何が欠けていますか?
EDIT
this.editor
は、次のように Backbone クラスrender
関数で作成されます。
this.editor = CKEDITOR.replace(this.$(this.id)[0], config);
instanceReady
作成直後にリスナーを追加しない理由はsetEnabledOnLoad
、インスタンスが完全に初期化される前に関数が GWT で呼び出されるためです。これは、コードを 2 か所に配置した結果です。GWT は「OK、インスタンスを作成してください」と言いましたが、GWT がコードの次の行に進み、それを有効/無効に設定しようとするまでに Backbone は終了していません。