From 63f89d628e71930821515feb2e9ee3bdfa0888eb Mon Sep 17 00:00:00 2001 From: Thomas Nordquist Date: Tue, 7 May 2019 13:18:02 +0200 Subject: [PATCH] Destroy view-models when destroying trees --- app/src/components/Tree/TreeNode.tsx | 2 +- app/src/model/TopicViewModel.ts | 7 ++++++- backend/src/Model/Destroyable.ts | 3 +++ backend/src/Model/Edge.ts | 3 ++- backend/src/Model/Tree.ts | 3 ++- backend/src/Model/TreeNode.ts | 5 ++++- backend/src/Model/TreeNodeFactory.ts | 5 +++-- 7 files changed, 21 insertions(+), 7 deletions(-) create mode 100644 backend/src/Model/Destroyable.ts diff --git a/app/src/components/Tree/TreeNode.tsx b/app/src/components/Tree/TreeNode.tsx index 6fd08cf..6ca1952 100644 --- a/app/src/components/Tree/TreeNode.tsx +++ b/app/src/components/Tree/TreeNode.tsx @@ -97,7 +97,7 @@ class TreeNodeComponent extends React.Component { treeNode.viewModel.change.subscribe(this.viewStateHasChanged) } - private viewStateHasChanged = (msg: void) => { + private viewStateHasChanged = () => { this.props.treeNode.viewModel && this.setState({ selected: this.props.treeNode.viewModel.isSelected() }) } diff --git a/app/src/model/TopicViewModel.ts b/app/src/model/TopicViewModel.ts index d13247a..3b842b8 100644 --- a/app/src/model/TopicViewModel.ts +++ b/app/src/model/TopicViewModel.ts @@ -1,6 +1,7 @@ +import { Destroyable } from '../../../backend/src/Model/Destroyable' import { EventDispatcher } from '../../../events' -export class TopicViewModel { +export class TopicViewModel implements Destroyable { private selected: boolean public change = new EventDispatcher() @@ -8,6 +9,10 @@ export class TopicViewModel { this.selected = false } + public destroy() { + this.change.removeAllListeners() + } + public isSelected() { return this.selected } diff --git a/backend/src/Model/Destroyable.ts b/backend/src/Model/Destroyable.ts new file mode 100644 index 0000000..032bdd9 --- /dev/null +++ b/backend/src/Model/Destroyable.ts @@ -0,0 +1,3 @@ +export interface Destroyable { + destroy(): void +} diff --git a/backend/src/Model/Edge.ts b/backend/src/Model/Edge.ts index 8ef3cbd..b7d8787 100644 --- a/backend/src/Model/Edge.ts +++ b/backend/src/Model/Edge.ts @@ -1,7 +1,8 @@ +import { Destroyable } from './Destroyable' import { Hashable, TreeNode } from './' const sha1 = require('sha1') -export class Edge implements Hashable { +export class Edge implements Hashable { public name: string public target!: TreeNode diff --git a/backend/src/Model/Tree.ts b/backend/src/Model/Tree.ts index d3c7311..77e43a2 100644 --- a/backend/src/Model/Tree.ts +++ b/backend/src/Model/Tree.ts @@ -1,4 +1,5 @@ import { ChangeBuffer } from './ChangeBuffer' +import { Destroyable } from './Destroyable' import { EventBusInterface, EventDispatcher, @@ -8,7 +9,7 @@ import { import { TreeNode } from './' import { TreeNodeFactory } from './TreeNodeFactory' -export class Tree extends TreeNode { +export class Tree extends TreeNode { public connectionId?: string public updateSource?: EventBusInterface public nodeFilter?: (node: TreeNode) => boolean diff --git a/backend/src/Model/TreeNode.ts b/backend/src/Model/TreeNode.ts index bd1c8ba..1f6f548 100644 --- a/backend/src/Model/TreeNode.ts +++ b/backend/src/Model/TreeNode.ts @@ -1,7 +1,8 @@ +import { Destroyable } from './Destroyable' import { Edge, Message, RingBuffer } from './' import { EventDispatcher, MqttMessage } from '../../../events' -export class TreeNode { +export class TreeNode { public sourceEdge?: Edge public message?: Message public mqttMessage?: MqttMessage @@ -103,6 +104,8 @@ export class TreeNode { for (const edge of this.edgeArray) { edge.target.destroy() } + this.viewModel && this.viewModel.destroy() + this.viewModel = undefined this.edgeArray = [] this.edges = {} this.cachedChildTopics = [] diff --git a/backend/src/Model/TreeNodeFactory.ts b/backend/src/Model/TreeNodeFactory.ts index 176aaa1..50bc4dd 100644 --- a/backend/src/Model/TreeNodeFactory.ts +++ b/backend/src/Model/TreeNodeFactory.ts @@ -1,9 +1,10 @@ import { Base64Message } from './Base64Message' +import { Destroyable } from './Destroyable' import { Edge, Tree, TreeNode } from './' export abstract class TreeNodeFactory { private static messageCounter = 0 - public static insertNodeAtPosition(edgeNames: Array, node: TreeNode) { + public static insertNodeAtPosition(edgeNames: Array, node: TreeNode) { let currentNode: TreeNode = new Tree() let edge for (const edgeName of edgeNames) { @@ -16,7 +17,7 @@ export abstract class TreeNodeFactory { node.sourceEdge!.target = node } - public static fromEdgesAndValue(edgeNames: Array, value?: Base64Message | null): TreeNode { + public static fromEdgesAndValue(edgeNames: Array, value?: Base64Message | null): TreeNode { const node = new TreeNode() node.setMessage({ value: value || undefined,