diff --git a/frontend-html/src/model/entities/DataSource.ts b/frontend-html/src/model/entities/DataSource.ts index 8867c80247..c9b5573231 100644 --- a/frontend-html/src/model/entities/DataSource.ts +++ b/frontend-html/src/model/entities/DataSource.ts @@ -51,4 +51,8 @@ export class DataSource implements IDataSource { getFieldByIndex(index: number): IDataSourceField | undefined { return this.fields.find(field => field.index === index); } + + dispose(){ + this.rowState.dispose(); + } } diff --git a/frontend-html/src/model/entities/FormScreen.ts b/frontend-html/src/model/entities/FormScreen.ts index 9249ce5cc5..ec4bfcaf81 100644 --- a/frontend-html/src/model/entities/FormScreen.ts +++ b/frontend-html/src/model/entities/FormScreen.ts @@ -251,8 +251,13 @@ export class FormScreen implements IFormScreen { console.log("End of View bindings"); console.log(""); } - /* eslint-enable no-console */ + + dispose(){ + for (let dataSource of this.dataSources) { + dataSource.dispose(); + } + } } export class FormScreenEnvelope implements IFormScreenEnvelope { diff --git a/frontend-html/src/model/entities/RowState.ts b/frontend-html/src/model/entities/RowState.ts index 53e47031bd..22597fa798 100644 --- a/frontend-html/src/model/entities/RowState.ts +++ b/frontend-html/src/model/entities/RowState.ts @@ -40,12 +40,13 @@ export class RowState implements IRowState { $type_IRowState: 1 = 1; suppressWorkingStatus: boolean = false; dataViewVisibleRows: Map = new Map(); + disposers: (()=> void)[] = []; constructor(debouncingDelayMilliseconds?: number) { this.triggerLoadDebounced = _.debounce( this.triggerLoadImm, debouncingDelayMilliseconds == undefined ? 0 : debouncingDelayMilliseconds); - visibleRowsChanged.subscribe((visibleRows) => { + const disposer = visibleRowsChanged.subscribe((visibleRows) => { const dataSource = getDataSource(this); if (!visibleRows || dataSource.identifier !== visibleRows.dataSourceId) { return; @@ -59,6 +60,7 @@ export class RowState implements IRowState { this.triggerLoadDebounced(); } }); + this.disposers.push(disposer); } monitor: FlowBusyMonitor = new FlowBusyMonitor(); @@ -257,6 +259,10 @@ export class RowState implements IRowState { // TODO: Wait when something is currently loading. } + dispose(){ + this.disposers.forEach(x => x()); + } + parent?: any; } diff --git a/frontend-html/src/model/entities/WorkbenchLifecycle/WorkbenchLifecycle.ts b/frontend-html/src/model/entities/WorkbenchLifecycle/WorkbenchLifecycle.ts index 85beda0c56..c644654753 100644 --- a/frontend-html/src/model/entities/WorkbenchLifecycle/WorkbenchLifecycle.ts +++ b/frontend-html/src/model/entities/WorkbenchLifecycle/WorkbenchLifecycle.ts @@ -386,6 +386,7 @@ export class WorkbenchLifecycle implements IWorkbenchLifecycle { const api = getApi(this); if (openedScreen.content) { if (openedScreen.content.formScreen) { + openedScreen.content.formScreen.dispose(); yield api.destroyUI({FormSessionId: getSessionId(openedScreen.content.formScreen)}); } else if (openedScreen.content.preloadedSessionId) { yield api.destroyUI({FormSessionId: openedScreen.content.preloadedSessionId}); diff --git a/frontend-html/src/model/entities/types/IDataSource.ts b/frontend-html/src/model/entities/types/IDataSource.ts index d108458e76..956903e31a 100644 --- a/frontend-html/src/model/entities/types/IDataSource.ts +++ b/frontend-html/src/model/entities/types/IDataSource.ts @@ -37,6 +37,8 @@ export interface IDataSource extends IDataSourceData { getFieldByIndex(idex: number): IDataSourceField | undefined; parent?: any; + + dispose(): void; } export const isIDataSource = (o: any): o is IDataSource => o.$type_IDataSource; diff --git a/frontend-html/src/model/entities/types/IFormScreen.ts b/frontend-html/src/model/entities/types/IFormScreen.ts index 0f004a83d4..2ed0c9c8d8 100644 --- a/frontend-html/src/model/entities/types/IFormScreen.ts +++ b/frontend-html/src/model/entities/types/IFormScreen.ts @@ -184,6 +184,8 @@ export interface IFormScreen extends IFormScreenData { printMasterDetailTree(): void; parent?: any; + + dispose(): void; } export interface IScreenNotification { diff --git a/frontend-html/src/model/entities/types/IRowState.ts b/frontend-html/src/model/entities/types/IRowState.ts index e5ae039f40..de88c55034 100644 --- a/frontend-html/src/model/entities/types/IRowState.ts +++ b/frontend-html/src/model/entities/types/IRowState.ts @@ -41,6 +41,8 @@ export interface IRowState extends IRowStateData { reload(): void; parent?: any; + + dispose(): void; } export interface IRowStateItem {