mirror of
https://github.com/odoo/owl.git
synced 2025-10-06 19:59:41 +07:00
[IMP] hooks: introduce useChildSubEnv and change useSubEnv
This commit is contained in:
committed by
Aaron Bohy
parent
e4b4ee471f
commit
aa95149997
@@ -103,7 +103,7 @@ exports[`hooks mounted callbacks should be called in reverse order from willUnmo
|
||||
}"
|
||||
`;
|
||||
|
||||
exports[`hooks parent and child env 1`] = `
|
||||
exports[`hooks parent and child env (with useChildSubEnv) 1`] = `
|
||||
"function anonymous(bdom, helpers
|
||||
) {
|
||||
let { text, createBlock, list, multi, html, toggler, component, comment } = bdom;
|
||||
@@ -116,7 +116,34 @@ exports[`hooks parent and child env 1`] = `
|
||||
}"
|
||||
`;
|
||||
|
||||
exports[`hooks parent and child env 2`] = `
|
||||
exports[`hooks parent and child env (with useChildSubEnv) 2`] = `
|
||||
"function anonymous(bdom, helpers
|
||||
) {
|
||||
let { text, createBlock, list, multi, html, toggler, component, comment } = bdom;
|
||||
|
||||
let block1 = createBlock(\`<div><block-text-0/></div>\`);
|
||||
|
||||
return function template(ctx, node, key = \\"\\") {
|
||||
let txt1 = ctx['env'].val;
|
||||
return block1([txt1]);
|
||||
}
|
||||
}"
|
||||
`;
|
||||
|
||||
exports[`hooks parent and child env (with useSubEnv) 1`] = `
|
||||
"function anonymous(bdom, helpers
|
||||
) {
|
||||
let { text, createBlock, list, multi, html, toggler, component, comment } = bdom;
|
||||
|
||||
return function template(ctx, node, key = \\"\\") {
|
||||
let b2 = text(ctx['env'].val);
|
||||
let b3 = component(\`Child\`, {}, key + \`__1\`, node, ctx);
|
||||
return multi([b2, b3]);
|
||||
}
|
||||
}"
|
||||
`;
|
||||
|
||||
exports[`hooks parent and child env (with useSubEnv) 2`] = `
|
||||
"function anonymous(bdom, helpers
|
||||
) {
|
||||
let { text, createBlock, list, multi, html, toggler, component, comment } = bdom;
|
||||
@@ -144,7 +171,7 @@ exports[`hooks two different call to willPatch/patched should work 1`] = `
|
||||
}"
|
||||
`;
|
||||
|
||||
exports[`hooks use sub env does not pollute user env 1`] = `
|
||||
exports[`hooks useChildSubEnv does not pollute user env 1`] = `
|
||||
"function anonymous(bdom, helpers
|
||||
) {
|
||||
let { text, createBlock, list, multi, html, toggler, component, comment } = bdom;
|
||||
@@ -158,7 +185,7 @@ exports[`hooks use sub env does not pollute user env 1`] = `
|
||||
}"
|
||||
`;
|
||||
|
||||
exports[`hooks use sub env supports arbitrary descriptor 1`] = `
|
||||
exports[`hooks useChildSubEnv supports arbitrary descriptor 1`] = `
|
||||
"function anonymous(bdom, helpers
|
||||
) {
|
||||
let { text, createBlock, list, multi, html, toggler, component, comment } = bdom;
|
||||
@@ -169,7 +196,7 @@ exports[`hooks use sub env supports arbitrary descriptor 1`] = `
|
||||
}"
|
||||
`;
|
||||
|
||||
exports[`hooks use sub env supports arbitrary descriptor 2`] = `
|
||||
exports[`hooks useChildSubEnv supports arbitrary descriptor 2`] = `
|
||||
"function anonymous(bdom, helpers
|
||||
) {
|
||||
let { text, createBlock, list, multi, html, toggler, component, comment } = bdom;
|
||||
@@ -287,3 +314,43 @@ exports[`hooks useRef hook: basic use 1`] = `
|
||||
}
|
||||
}"
|
||||
`;
|
||||
|
||||
exports[`hooks useSubEnv modifies user env 1`] = `
|
||||
"function anonymous(bdom, helpers
|
||||
) {
|
||||
let { text, createBlock, list, multi, html, toggler, component, comment } = bdom;
|
||||
|
||||
let block1 = createBlock(\`<div><block-text-0/></div>\`);
|
||||
|
||||
return function template(ctx, node, key = \\"\\") {
|
||||
let txt1 = ctx['env'].val;
|
||||
return block1([txt1]);
|
||||
}
|
||||
}"
|
||||
`;
|
||||
|
||||
exports[`hooks useSubEnv supports arbitrary descriptor 1`] = `
|
||||
"function anonymous(bdom, helpers
|
||||
) {
|
||||
let { text, createBlock, list, multi, html, toggler, component, comment } = bdom;
|
||||
|
||||
return function template(ctx, node, key = \\"\\") {
|
||||
return component(\`Child\`, {}, key + \`__1\`, node, ctx);
|
||||
}
|
||||
}"
|
||||
`;
|
||||
|
||||
exports[`hooks useSubEnv supports arbitrary descriptor 2`] = `
|
||||
"function anonymous(bdom, helpers
|
||||
) {
|
||||
let { text, createBlock, list, multi, html, toggler, component, comment } = bdom;
|
||||
|
||||
let block1 = createBlock(\`<div><block-text-0/> <block-text-1/></div>\`);
|
||||
|
||||
return function template(ctx, node, key = \\"\\") {
|
||||
let txt1 = ctx['env'].someVal;
|
||||
let txt2 = ctx['env'].someVal2;
|
||||
return block1([txt1, txt2]);
|
||||
}
|
||||
}"
|
||||
`;
|
||||
|
||||
@@ -14,6 +14,7 @@ import {
|
||||
useExternalListener,
|
||||
useRef,
|
||||
useState,
|
||||
useChildSubEnv,
|
||||
useSubEnv,
|
||||
xml,
|
||||
} from "../../src/index";
|
||||
@@ -180,7 +181,7 @@ describe("hooks", () => {
|
||||
expect(fixture.innerHTML).toBe("<div>1</div>");
|
||||
});
|
||||
|
||||
test("use sub env does not pollute user env", async () => {
|
||||
test("useSubEnv modifies user env", async () => {
|
||||
class Test extends Component {
|
||||
static template = xml`<div><t t-esc="env.val"/></div>`;
|
||||
setup() {
|
||||
@@ -190,11 +191,25 @@ describe("hooks", () => {
|
||||
const env = { val: 3 };
|
||||
const component = await mount(Test, fixture, { env });
|
||||
expect(fixture.innerHTML).toBe("<div>3</div>");
|
||||
expect(component.env).toHaveProperty("val2");
|
||||
expect(component.env).toHaveProperty("val");
|
||||
});
|
||||
|
||||
test("useChildSubEnv does not pollute user env", async () => {
|
||||
class Test extends Component {
|
||||
static template = xml`<div><t t-esc="env.val"/></div>`;
|
||||
setup() {
|
||||
useChildSubEnv({ val2: 1 });
|
||||
}
|
||||
}
|
||||
const env = { val: 3 };
|
||||
const component = await mount(Test, fixture, { env });
|
||||
expect(fixture.innerHTML).toBe("<div>3</div>");
|
||||
expect(component.env).not.toHaveProperty("val2");
|
||||
expect(component.env).toHaveProperty("val");
|
||||
});
|
||||
|
||||
test("use sub env supports arbitrary descriptor", async () => {
|
||||
test("useSubEnv supports arbitrary descriptor", async () => {
|
||||
let someVal = "maggot";
|
||||
let someVal2 = "brain";
|
||||
|
||||
@@ -213,6 +228,40 @@ describe("hooks", () => {
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
const env = {
|
||||
get someVal() {
|
||||
return someVal;
|
||||
},
|
||||
};
|
||||
const component = await mount(Test, fixture, { env });
|
||||
expect(fixture.innerHTML).toBe("<div>maggot brain</div>");
|
||||
someVal = "brain";
|
||||
someVal2 = "maggot";
|
||||
component.render();
|
||||
await nextTick();
|
||||
expect(fixture.innerHTML).toBe("<div>brain maggot</div>");
|
||||
});
|
||||
|
||||
test("useChildSubEnv supports arbitrary descriptor", async () => {
|
||||
let someVal = "maggot";
|
||||
let someVal2 = "brain";
|
||||
|
||||
class Child extends Component {
|
||||
static template = xml`<div><t t-esc="env.someVal" /> <t t-esc="env.someVal2" /></div>`;
|
||||
}
|
||||
|
||||
class Test extends Component {
|
||||
static template = xml`<Child />`;
|
||||
static components = { Child };
|
||||
setup() {
|
||||
useChildSubEnv({
|
||||
get someVal2() {
|
||||
return someVal2;
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
someVal = "maggot";
|
||||
const env = {
|
||||
get someVal() {
|
||||
@@ -239,7 +288,7 @@ describe("hooks", () => {
|
||||
await mount(Test, fixture);
|
||||
});
|
||||
|
||||
test("parent and child env", async () => {
|
||||
test("parent and child env (with useSubEnv)", async () => {
|
||||
class Child extends Component {
|
||||
static template = xml`<div><t t-esc="env.val"/></div>`;
|
||||
}
|
||||
@@ -253,6 +302,23 @@ describe("hooks", () => {
|
||||
}
|
||||
const env = { val: 3 };
|
||||
await mount(Parent, fixture, { env });
|
||||
expect(fixture.innerHTML).toBe("5<div>5</div>");
|
||||
});
|
||||
|
||||
test("parent and child env (with useChildSubEnv)", async () => {
|
||||
class Child extends Component {
|
||||
static template = xml`<div><t t-esc="env.val"/></div>`;
|
||||
}
|
||||
|
||||
class Parent extends Component {
|
||||
static template = xml`<t t-esc="env.val"/><Child/>`;
|
||||
static components = { Child };
|
||||
setup() {
|
||||
useChildSubEnv({ val: 5 });
|
||||
}
|
||||
}
|
||||
const env = { val: 3 };
|
||||
await mount(Parent, fixture, { env });
|
||||
expect(fixture.innerHTML).toBe("3<div>5</div>");
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user