From a357ff6b378fd998286f670be67c4ba1658667f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9ry=20Debongnie?= Date: Mon, 21 Jan 2019 16:26:51 +0100 Subject: [PATCH] call mounted recursively on all children --- src/core/widget.ts | 9 ++++++++- tests/widget.test.ts | 28 +++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/core/widget.ts b/src/core/widget.ts index 87e29e29..858ffd57 100644 --- a/src/core/widget.ts +++ b/src/core/widget.ts @@ -59,7 +59,7 @@ export default class Widget { if (target) { target.appendChild(this.el!); if (document.body.contains(target)) { - this.mounted(); + this.visitSubTree(w => w.mounted()) } } return vnode; @@ -102,4 +102,11 @@ export default class Widget { this.vnode = vnode; return vnode; } + + private visitSubTree(callback: (w: Widget) => void) { + callback(this); + for (let child of this.children) { + child.visitSubTree(callback); + } + } } diff --git a/tests/widget.test.ts b/tests/widget.test.ts index 2f7c5aef..be9458e8 100644 --- a/tests/widget.test.ts +++ b/tests/widget.test.ts @@ -108,6 +108,32 @@ describe("lifecycle hooks", () => { expect(mounted).toBe(true); target.remove(); }); + + test("mounted hook is called on subwidgets, in proper order", async () => { + expect.assertions(2); + let parentMounted = false; + let childMounted = false; + class ParentWidget extends Widget { + name="a"; + template = `
Hello
`; + widgets = { child: ChildWidget }; + async mounted() { + expect(childMounted).toBe(false); + parentMounted = true; + } + } + class ChildWidget extends Widget { + async mounted() { + expect(parentMounted).toBe(true); + childMounted = true; + } + } + const widget = makeWidget(ParentWidget); + const target = document.createElement("div"); + document.body.appendChild(target); + await widget.mount(target); + target.remove(); + }); }); describe("destroy method", () => { @@ -142,7 +168,7 @@ describe("composition", () => { test("t-refs on widget are widgets", async () => { class WidgetC extends Widget { name = "a"; - template = `
Hello
`; + template = `
Hello
`; widgets = { b: WidgetB }; } const widget = makeWidget(WidgetC);