allow new widgets to be mount in mounted hook

This commit is contained in:
Géry Debongnie
2019-01-24 22:17:06 +01:00
parent dbada21890
commit c1dd38bf03
2 changed files with 31 additions and 2 deletions
+30 -1
View File
@@ -157,7 +157,7 @@ describe("lifecycle hooks", () => {
let childMounted = false;
class ParentWidget extends Widget<TestEnv> {
name = "a";
template = `<div>Hello<t t-widget="child"/></div>`;
template = `<div><t t-widget="child"/></div>`;
widgets = { child: ChildWidget };
mounted() {
expect(childMounted).toBe(false);
@@ -216,6 +216,35 @@ describe("lifecycle hooks", () => {
expect(hookCounter).toBe(2);
target.remove();
});
test("mounted hook is correctly called on subwidgets created in mounted hook", async done => {
// the issue here is that the parent widget creates in the
// mounted hook a new widget, which means that it modifies
// in place its list of children. But this list of children is currently
// being visited, so the mount action of the parent could cause a mount
// action of the new child widget, even though it is not ready yet.
expect.assertions(1);
const target = document.createElement("div");
document.body.appendChild(target);
class ParentWidget extends Widget<TestEnv> {
name = "a";
mounted() {
const child = new ChildWidget(this);
child.mount(this.el!);
}
}
class ChildWidget extends Widget<TestEnv> {
mounted() {
expect(this.el).toBeTruthy();
target.remove();
done();
}
}
const widget = makeWidget(ParentWidget);
await widget.mount(target);
});
});
describe("destroy method", () => {