From 8bbabac232785a613376459b73a3fa2d44180f49 Mon Sep 17 00:00:00 2001 From: Gneev Roland Date: Wed, 21 Mar 2018 12:10:16 +0300 Subject: [PATCH 1/3] Remove CKEditor instance on unmount --- src/ckeditor.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/ckeditor.js b/src/ckeditor.js index 0f09286..8431247 100644 --- a/src/ckeditor.js +++ b/src/ckeditor.js @@ -25,15 +25,19 @@ class CKEditor extends React.Component { //load ckeditor script as soon as component mounts if not already loaded componentDidMount() { - if(!this.props.isScriptLoaded){ + if (!this.props.isScriptLoaded) { loadScript(this.props.scriptUrl, this.onLoad); - }else{ + } else { this.onLoad(); } } componentWillUnmount() { this.unmounting = true; + if (this.editorInstance) { + this.editorInstance.removeAllListeners(); + window.CKEDITOR.remove(this.editorInstance); + } } onLoad() { @@ -69,7 +73,7 @@ class CKEditor extends React.Component { */ //Register listener for custom events if any - for(var event in this.props.events){ + for (var event in this.props.events) { var eventHandler = this.props.events[event]; this.editorInstance.on(event, eventHandler); From 7382279e6a0b07f2ab8773dab0d4eea4cb7fcbec Mon Sep 17 00:00:00 2001 From: Gneev Roland Date: Thu, 22 Mar 2018 11:20:44 +0300 Subject: [PATCH 2/3] Reregister event handlers on reception of new props --- src/ckeditor.js | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/ckeditor.js b/src/ckeditor.js index 8431247..cbf9b93 100644 --- a/src/ckeditor.js +++ b/src/ckeditor.js @@ -15,6 +15,7 @@ class CKEditor extends React.Component { //Bindings this.onLoad = this.onLoad.bind(this); + this.registerEventHandlers = this.registerEventHandlers.bind(this); //State initialization this.state = { @@ -72,14 +73,28 @@ class CKEditor extends React.Component { }); */ + this.registerEventHandlers(this.props.events); + } + + registerEventHandlers(events, prevEvents) { + prevEvents = prevEvents || {}; + //Register listener for custom events if any - for (var event in this.props.events) { - var eventHandler = this.props.events[event]; + for (var event in events) { + if (events[event] !== prevEvents[event]) { + var prevEventHandler = prevEvents[event]; + if (prevEventHandler) this.editorInstance.removeListener(event, prevEventHandler); - this.editorInstance.on(event, eventHandler); + var eventHandler = events[event]; + this.editorInstance.on(event, eventHandler); + } } } + componentWillReceiveProps(nextProps) { + this.registerEventHandlers(nextProps.events, this.props.events); + } + render() { return
; } From 0e526ce0ffc3e0301f8c72100b51b683b3ac4c64 Mon Sep 17 00:00:00 2001 From: Gneev Roland Date: Thu, 22 Mar 2018 11:42:50 +0300 Subject: [PATCH 3/3] Guard check for cases when componentWillReceiveProps is called before the editor instance is created --- src/ckeditor.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ckeditor.js b/src/ckeditor.js index cbf9b93..68a514e 100644 --- a/src/ckeditor.js +++ b/src/ckeditor.js @@ -92,7 +92,7 @@ class CKEditor extends React.Component { } componentWillReceiveProps(nextProps) { - this.registerEventHandlers(nextProps.events, this.props.events); + if (this.editorInstance) this.registerEventHandlers(nextProps.events, this.props.events); } render() {