Ich versuche, meine CKEditor-Instanz zu "readOnly" zu setzen, nachdem die Instanz vollständig geladen wurde, aber ich bekomme einen Javascript-Fehler: Cannot call method 'setReadOnly' of null
. Wenn ich drüber nachdenke, kommt der Fehler von dieser Zeile in der ckeditor.js innerhalb der editor.setReadOnly
Methode: this.editable().setReadOnly(a);
Das bedeutet, dass der Editor existiert, aber die editable
Methode/Attribut (auf der CKEditor-Instanz) nicht.setReadOnly verursacht Fehler beim Aufruf von instanceReady von CKEditor
Unten ist mein Code, und ich werde es ein wenig erklären. Meine App ist eine Kombination aus GWT und Backbone. Der CKEditor selbst wird durch den Backbone-Code erstellt, aber das übergeordnete Element befindet sich in GWT, daher initiiere ich dort die Aktion 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();
}
}
Die Backbone-Klasse hat einen Hörer für Namespace.Events.SET_ENABLED
die setEnabled
auslöst.
Gibt es ein anderes CKEditor-Ereignis, auf das ich achten sollte? Es scheint kein instanceReady
Ereignis auf editable
zu sein. Was vermisse ich?
EDIT
this.editor
in der Backbone-Klasse render
Funktion wie folgt erstellt:
this.editor = CKEDITOR.replace(this.$(this.id)[0], config);
Der Grund, warum ich nicht hinzufügen, die instanceReady
Zuhörer direkt nach ihrer Erstellung wird, weil die Funktion setEnabledOnLoad
heißt in GWT, bevor die Instanz vollständig initialisiert wurde. Dies ist ein Ergebnis des Codes an zwei Stellen. GWT hat "ok, erstelle die Instanz" gesagt, aber Backbone ist noch nicht fertig, wenn GWT zur nächsten Codezeile geht und sie aktivieren/deaktivieren möchte.
'CKEDITOR' hält alle Instanzen, aber es tut auch viel mehr. Der Grund, dass ich den 'instanceReady'-Listener nicht zur Instanz hinzufüge, liegt darin, dass die Funktion' setEnabledOnLoad' aufgerufen wird, bevor die Instanz erstellt wurde. Dies ist ein Ergebnis des Codes an zwei Stellen. GWT hat "ok, erstelle die Instanz" gesagt, aber Backbone ist noch nicht fertig, wenn GWT zur nächsten Codezeile geht und sie aktivieren/deaktivieren möchte. –
Ich gebe zu, dass mir das richtige Wissen über Backbone und GWT fehlt, um meine Antwort weiter zu beantworten:] Hoffentlich kann jemand hineinspringen. – Noseratio