mirror of
https://github.com/odoo/owl.git
synced 2025-10-06 19:59:41 +07:00
[IMP] component: support dynamic t-props
It is useful in some rare situations. closes #144
This commit is contained in:
@@ -657,6 +657,49 @@ exports[`composition t-component with dynamic value 2 1`] = `
|
||||
}"
|
||||
`;
|
||||
|
||||
exports[`dynamic t-props basic use 1`] = `
|
||||
"function anonymous(context,extra
|
||||
) {
|
||||
let utils = this.constructor.utils;
|
||||
let QWeb = this.constructor;
|
||||
let parent = context;
|
||||
let owner = context;
|
||||
let result;
|
||||
var h = this.h;
|
||||
let c1 = [], p1 = {key:1};
|
||||
var vn1 = h('div', p1, c1);
|
||||
result = vn1;
|
||||
//COMPONENT
|
||||
let def3;
|
||||
let w4 = 4 in parent.__owl__.cmap ? parent.__owl__.children[parent.__owl__.cmap[4]] : false;
|
||||
let _2_index = c1.length;
|
||||
c1.push(null);
|
||||
let props4 = Object.assign({}, context['some'].obj);
|
||||
if (w4 && w4.__owl__.renderPromise && !w4.__owl__.vnode) {
|
||||
if (utils.shallowEqual(props4, w4.__owl__.renderProps)) {
|
||||
def3 = w4.__owl__.renderPromise;
|
||||
} else {
|
||||
w4.destroy();
|
||||
w4 = false;
|
||||
}
|
||||
}
|
||||
if (!w4) {
|
||||
let componentKey4 = \`Child\`;
|
||||
let W4 = context.constructor.components[componentKey4] || QWeb.components[componentKey4];
|
||||
if (!W4) {throw new Error('Cannot find the definition of component \\"' + componentKey4 + '\\"')}
|
||||
w4 = new W4(parent, props4);
|
||||
parent.__owl__.cmap[4] = w4.__owl__.id;
|
||||
def3 = w4.__prepare();
|
||||
def3 = def3.then(vnode=>{if (w4.__owl__.isDestroyed){return}let pvnode=h(vnode.sel, {key: 4, hook: {insert(vn) {let nvn=w4.__mount(vnode, pvnode.elm);pvnode.elm=nvn.elm;},remove() {},destroy(vn) {w4.destroy();}}});c1[_2_index]=pvnode;w4.__owl__.pvnode = pvnode;});
|
||||
} else {
|
||||
def3 = def3 || w4.__updateProps(props4, extra.forceUpdate, extra.patchQueue);
|
||||
def3 = def3.then(()=>{if (w4.__owl__.isDestroyed) {return};let pvnode=w4.__owl__.pvnode;c1[_2_index]=pvnode;});
|
||||
}
|
||||
extra.promises.push(def3);
|
||||
return result;
|
||||
}"
|
||||
`;
|
||||
|
||||
exports[`lifecycle hooks willPatch/patched hook with t-keepalive 1`] = `
|
||||
"function anonymous(context,extra
|
||||
) {
|
||||
|
||||
@@ -63,7 +63,6 @@ class WidgetA extends Widget {
|
||||
static components = { b: WidgetB };
|
||||
}
|
||||
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Tests
|
||||
//------------------------------------------------------------------------------
|
||||
@@ -900,7 +899,6 @@ describe("destroy method", () => {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
const parent = new Parent(env);
|
||||
await parent.mount(fixture);
|
||||
expect(fixture.innerHTML).toBe("<div><span><button>click</button></span></div>");
|
||||
@@ -2243,7 +2241,6 @@ describe("random stuff/miscellaneous", () => {
|
||||
name = "A";
|
||||
}
|
||||
|
||||
|
||||
const a = new A(env);
|
||||
await a.mount(fixture);
|
||||
expect(fixture.innerHTML).toBe(`<div>A<div>B</div><div>C<div>D</div><div>E</div></div></div>`);
|
||||
@@ -4317,7 +4314,7 @@ describe("dynamic root nodes", () => {
|
||||
</templates>
|
||||
`);
|
||||
class TestWidget extends Widget {
|
||||
state = {flag: true};
|
||||
state = { flag: true };
|
||||
}
|
||||
|
||||
const widget = new TestWidget(env);
|
||||
@@ -4344,8 +4341,8 @@ describe("dynamic root nodes", () => {
|
||||
class ChildA extends Widget {}
|
||||
class ChildB extends Widget {}
|
||||
class TestWidget extends Widget {
|
||||
static components = {ChildA, ChildB};
|
||||
state = {flag: true};
|
||||
static components = { ChildA, ChildB };
|
||||
state = { flag: true };
|
||||
}
|
||||
|
||||
const widget = new TestWidget(env);
|
||||
@@ -4357,5 +4354,38 @@ describe("dynamic root nodes", () => {
|
||||
|
||||
expect(fixture.innerHTML).toBe("<div>abc</div>");
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
describe("dynamic t-props", () => {
|
||||
test("basic use", async () => {
|
||||
expect.assertions(4);
|
||||
env.qweb.addTemplates(`
|
||||
<templates>
|
||||
<span t-name="Child">
|
||||
<t t-esc="props.a + props.b"/>
|
||||
</span>
|
||||
<div t-name="Parent">
|
||||
<Child t-props="some.obj"/>
|
||||
</div>
|
||||
</templates>
|
||||
`);
|
||||
class Child extends Widget {
|
||||
constructor(parent, props) {
|
||||
super(parent, props);
|
||||
expect(props).toEqual({ a: 1, b: 2 });
|
||||
expect(props).not.toBe(widget.some.obj);
|
||||
}
|
||||
}
|
||||
class Parent extends Widget {
|
||||
static components = { Child };
|
||||
|
||||
some = { obj: { a: 1, b: 2 } };
|
||||
}
|
||||
|
||||
const widget = new Parent(env);
|
||||
await widget.mount(fixture);
|
||||
|
||||
expect(fixture.innerHTML).toBe("<div><span>3</span></div>");
|
||||
expect(env.qweb.templates.Parent.fn.toString()).toMatchSnapshot();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -573,7 +573,6 @@ describe("connecting a component to store", () => {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
const state = { current: "a", msg: { a: "a", b: "b" } };
|
||||
const actions = {
|
||||
setCurrent({ state }, c) {
|
||||
@@ -627,7 +626,6 @@ describe("connecting a component to store", () => {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
const state = { someId: 1, flag: true, messages: { 1: "abc" } };
|
||||
const actions = {
|
||||
setFlagToFalse({ state }) {
|
||||
@@ -714,7 +712,6 @@ describe("connecting a component to store", () => {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
(<any>env).store = store;
|
||||
const app = new TodoApp(env);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user