Pārlūkot izejas kodu

disposing event listeners correctly

Raanan Weber 7 gadi atpakaļ
vecāks
revīzija
e5ba55e4c9
2 mainītis faili ar 17 papildinājumiem un 2 dzēšanām
  1. 5 2
      Viewer/src/index.ts
  2. 12 0
      Viewer/src/templateManager.ts

+ 5 - 2
Viewer/src/index.ts

@@ -22,10 +22,13 @@ import { InitTags } from './initializer';
 PromisePolyfill.Apply();
 
 export let disableInit: boolean = false;
-document.addEventListener("DOMContentLoaded", function (event) {
+document.addEventListener("DOMContentLoaded", init);
+
+function init(event) {
+    document.removeEventListener("DOMContentLoaded", init);
     if (disableInit) return;
     InitTags();
-});
+}
 
 // public API for initialization
 export { InitTags, DefaultViewer, AbstractViewer, viewerManager, mapperManager };

+ 12 - 0
Viewer/src/templateManager.ts

@@ -366,6 +366,12 @@ export class Template {
             request.abort();
         });
 
+        if (this.registeredEvents) {
+            this.registeredEvents.forEach(evt => {
+                evt.htmlElement.removeEventListener(evt.eventName, evt.function);
+            });
+        }
+
         delete this.fragment;
     }
 
@@ -417,7 +423,13 @@ export class Template {
 
                     // if boolean, set the parent as the event listener
                     if (typeof this._configuration.events[eventName] === 'boolean') {
+                        let binding = functionToFire.bind(this, '#' + this.parent.id);
                         this.parent.addEventListener(eventName, functionToFire.bind(this, '#' + this.parent.id), false);
+                        this.registeredEvents.push({
+                            htmlElement: this.parent,
+                            eventName: eventName,
+                            function: binding
+                        });
                     } else if (typeof this._configuration.events[eventName] === 'object') {
                         let selectorsArray: Array<string> = Object.keys(this._configuration.events[eventName] || {});
                         // strict null checl is working incorrectly, must override: