Skip to content
This repository was archived by the owner on May 5, 2021. It is now read-only.

Commit 210a37d

Browse files
committed
fix perf + memory leak layout
1 parent 754b409 commit 210a37d

File tree

3 files changed

+52
-18
lines changed

3 files changed

+52
-18
lines changed

packages/plugin-dom-layout/src/ActionableDomObjectRenderer.ts

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,17 @@ export class ActionableDomObjectRenderer extends AbstractRenderer<DomObject> {
1515
engine: DomObjectRenderingEngine;
1616
predicate: Predicate = ActionableNode;
1717

18+
actionableNodes = new Map<ActionableNode, HTMLElement>();
19+
20+
constructor(engine: DomObjectRenderingEngine) {
21+
super(engine);
22+
this.engine.editor.dispatcher.registerCommandHook(
23+
'commit',
24+
this._updateActionables.bind(this),
25+
);
26+
}
27+
1828
async render(button: ActionableNode): Promise<DomObjectActionable> {
19-
let updateButton: () => void;
2029
let handler: (ev: MouseEvent) => void;
2130
const objectButton: DomObjectActionable = {
2231
tag: 'BUTTON',
@@ -34,13 +43,11 @@ export class ActionableDomObjectRenderer extends AbstractRenderer<DomObject> {
3443
objectButton.handler();
3544
};
3645
el.addEventListener('click', handler);
37-
updateButton = this._updateButton.bind(this, button, el);
38-
updateButton();
39-
this.engine.editor.dispatcher.registerCommandHook('commit', updateButton);
46+
this.actionableNodes.set(button, el);
4047
},
4148
detach: (el: HTMLButtonElement): void => {
4249
el.removeEventListener('click', handler);
43-
this.engine.editor.dispatcher.removeCommandHook('commit', updateButton);
50+
this.actionableNodes.delete(button);
4451
},
4552
};
4653
this.engine.renderAttributes(Attributes, button, objectButton);
@@ -55,17 +62,26 @@ export class ActionableDomObjectRenderer extends AbstractRenderer<DomObject> {
5562

5663
return objectButton;
5764
}
65+
66+
protected _updateActionables(): void {
67+
const pathChanges = this.engine.editor.memory.getChangedVersionables();
68+
console.log(pathChanges);
69+
70+
for (const [button, element] of this.actionableNodes) {
71+
this._updateActionable(button, element);
72+
}
73+
}
5874
/**
5975
* Update button rendering after the command if the value of selected or
6076
* enabled change.
6177
*
62-
* @param button
78+
* @param aactionable
6379
* @param element
6480
*/
65-
private _updateButton(button: ActionableNode, element: HTMLButtonElement): void {
81+
protected _updateActionable(aactionable: ActionableNode, element: HTMLElement): void {
6682
const editor = this.engine.editor;
67-
const select = !!button.selected(editor);
68-
const enable = !!button.enabled(editor);
83+
const select = !!aactionable.selected(editor);
84+
const enable = !!aactionable.enabled(editor);
6985

7086
const attrSelected = element.getAttribute('aria-pressed');
7187
if (select.toString() !== attrSelected) {

packages/plugin-dom-layout/src/ActionableGroupSelectItemDomObjectRenderer.ts

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,26 @@ import { VNode } from '../../core/src/VNodes/VNode';
1111
import { LabelNode } from '../../plugin-layout/src/LabelNode';
1212
import { ZoneNode } from '../../plugin-layout/src/ZoneNode';
1313
import { DomObjectActionable } from './ActionableDomObjectRenderer';
14+
import { RenderingEngine } from '../../plugin-renderer/src/RenderingEngine';
1415

1516
export class ActionableGroupSelectItemDomObjectRenderer extends AbstractRenderer<DomObject> {
1617
static id = DomObjectRenderingEngine.id;
1718
engine: DomObjectRenderingEngine;
1819
predicate = (node: VNode): boolean => node.ancestors(ActionableGroupNode).length >= 2;
1920

21+
actionableNodes = new Map<ActionableNode, HTMLElement>();
22+
23+
constructor(engine: DomObjectRenderingEngine) {
24+
super(engine);
25+
this.engine.editor.dispatcher.registerCommandHook(
26+
'commit',
27+
this._updateActionables.bind(this),
28+
);
29+
}
30+
2031
async render(item: VNode): Promise<DomObject> {
2132
let domObject: DomObject;
2233
if (item instanceof ActionableNode) {
23-
let updateOption: () => void;
2434
let handler: (ev: Event) => void;
2535
const domObjectActionable: DomObjectActionable = {
2636
tag: 'OPTION',
@@ -43,14 +53,12 @@ export class ActionableGroupSelectItemDomObjectRenderer extends AbstractRenderer
4353
}
4454
};
4555
select.addEventListener('change', handler);
46-
updateOption = this._updateOption.bind(this, item, el);
47-
updateOption();
48-
this.engine.editor.dispatcher.registerCommandHook('commit', updateOption);
56+
this.actionableNodes.set(item, el);
4957
},
5058
detach: (el: HTMLOptionElement): void => {
5159
const select = el.closest('select') || el.parentElement;
5260
select.removeEventListener('change', handler);
53-
this.engine.editor.dispatcher.removeCommandHook('commit', updateOption);
61+
this.actionableNodes.delete(item);
5462
},
5563
};
5664
domObject = domObjectActionable;
@@ -105,17 +113,26 @@ export class ActionableGroupSelectItemDomObjectRenderer extends AbstractRenderer
105113

106114
return domObject;
107115
}
116+
117+
protected _updateActionables(): void {
118+
const pathChanges = this.engine.editor.memory.getChangedVersionables();
119+
console.log(pathChanges);
120+
121+
for (const [button, element] of this.actionableNodes) {
122+
this._updateActionable(button, element);
123+
}
124+
}
108125
/**
109126
* Update option rendering after the command if the value of selected or
110127
* enabled change.
111128
*
112-
* @param button
129+
* @param aactionable
113130
* @param element
114131
*/
115-
private _updateOption(button: ActionableNode, element: HTMLOptionElement): void {
132+
protected _updateActionable(aactionable: ActionableNode, element: HTMLElement): void {
116133
const editor = this.engine.editor;
117-
const select = button.selected(editor);
118-
const enable = button.enabled(editor);
134+
const select = aactionable.selected(editor);
135+
const enable = aactionable.enabled(editor);
119136
const attrSelected = element.getAttribute('selected');
120137
if (select.toString() !== attrSelected) {
121138
if (select) {

packages/plugin-dom-layout/src/DomReconciliationEngine.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,7 @@ export class DomReconciliationEngine {
310310
object.object.attach(...object.dom);
311311
}
312312
}
313+
this._domUpdated.clear();
313314
}
314315

315316
/**

0 commit comments

Comments
 (0)