浏览代码

introducing disposeAll for the viewer.
As it is possible to have more than one viewer instance on the same page, disposeAll will dispose all of the viewers AND the context of the rest of the singletons.

Raanan Weber 7 年之前
父节点
当前提交
7b110586b2

+ 12 - 3
Viewer/src/configuration/loader.ts

@@ -11,7 +11,7 @@ export class ConfigurationLoader {
 
     private loadRequests: Array<IFileRequest>;
 
-    constructor() {
+    constructor(private _enableCache: boolean = false) {
         this.configurationCache = {};
         this.loadRequests = [];
     }
@@ -77,12 +77,21 @@ export class ConfigurationLoader {
 
     private loadFile(url: string): Promise<any> {
         let cacheReference = this.configurationCache;
-        if (cacheReference[url]) {
+        if (this._enableCache && cacheReference[url]) {
             return Promise.resolve(cacheReference[url]);
         }
 
         return new Promise((resolve, reject) => {
-            let fileRequest = Tools.LoadFile(url, resolve, undefined, undefined, false, (request, error: any) => {
+            let fileRequest = Tools.LoadFile(url, (result) => {
+                let idx = this.loadRequests.indexOf(fileRequest);
+                if (idx !== -1)
+                    this.loadRequests.splice(idx, 1);
+                if (this._enableCache) cacheReference[url] = result;
+                resolve(result);
+            }, undefined, undefined, false, (request, error: any) => {
+                let idx = this.loadRequests.indexOf(fileRequest);
+                if (idx !== -1)
+                    this.loadRequests.splice(idx, 1);
                 reject(error);
             });
             this.loadRequests.push(fileRequest);

+ 4 - 0
Viewer/src/configuration/mappers.ts

@@ -118,6 +118,10 @@ export class MapperManager {
         this.mappers[type] = mapper;
     }
 
+    public dispose() {
+        this.mappers = {};
+    }
+
 }
 
 export let mapperManager = new MapperManager();

+ 4 - 0
Viewer/src/eventManager.ts

@@ -37,4 +37,8 @@ export class EventManager {
             callbackDef.callback(data);
         });
     }
+
+    public dispose() {
+        this.callbacksContainer = {};
+    }
 }

+ 7 - 0
Viewer/src/index.ts

@@ -17,6 +17,7 @@ import '../assets/pep.min';
 
 
 import { InitTags } from './initializer';
+import { configurationLoader } from './configuration/loader';
 
 // promise polyfill, if needed!
 PromisePolyfill.Apply();
@@ -29,5 +30,11 @@ function init(event) {
     InitTags();
 }
 
+function disposeAll() {
+    viewerManager.dispose();
+    mapperManager.dispose();
+    configurationLoader.dispose();
+}
+
 // public API for initialization
 export { InitTags, DefaultViewer, AbstractViewer, viewerManager, mapperManager };

+ 1 - 0
Viewer/src/templateManager.ts

@@ -164,6 +164,7 @@ export class TemplateManager {
             this.templates[template].dispose();
         });
         this.templates = {};
+        this.eventManager.dispose();
 
         this.onInit.clear();
         this.onAllLoaded.clear();

+ 6 - 0
Viewer/src/viewer/viewerManager.ts

@@ -58,6 +58,12 @@ export class ViewerManager {
         this.onViewerAdded && this.onViewerAdded(viewer);
         this.onViewerAddedObservable.notifyObservers(viewer);
     }
+
+    public dispose() {
+        for (let id in this.viewers) {
+            this.viewers[id].dispose();
+        }
+    }
 }
 
 export let viewerManager = new ViewerManager();