mirror of
https://github.com/odoo/owl.git
synced 2025-10-06 19:59:41 +07:00
work on composability
This commit is contained in:
+2
-2
@@ -15,9 +15,9 @@ export default class Counter extends Widget {
|
|||||||
counter: 0
|
counter: 0
|
||||||
};
|
};
|
||||||
|
|
||||||
constructor(parent: Widget | null, initialState?: number) {
|
constructor(parent: Widget, props: {initialState?: number}) {
|
||||||
super(parent);
|
super(parent);
|
||||||
this.state.counter = initialState || 0;
|
this.state.counter = props.initialState || 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
increment(delta: number) {
|
increment(delta: number) {
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
import Widget from "../../src/core/widget";
|
||||||
|
import Counter from "./Counter";
|
||||||
|
|
||||||
|
const template = `
|
||||||
|
<div t-debug="1">
|
||||||
|
<span>Root Widget</span>
|
||||||
|
<button t-on-click="resetCounter">Reset</button>
|
||||||
|
<button t-on-click="toggle">Toggle Counter</button>
|
||||||
|
<input/>
|
||||||
|
<t t-if="state.validcounter">
|
||||||
|
<t t-widget="Counter" t-ref="counter" t-props="{initialState:4}"/>
|
||||||
|
</t>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
|
||||||
|
export default class RootWidget extends Widget {
|
||||||
|
name = "root";
|
||||||
|
template = template;
|
||||||
|
widgets = { Counter };
|
||||||
|
state = { validcounter: true};
|
||||||
|
|
||||||
|
resetCounter(ev: MouseEvent) {
|
||||||
|
this.refs.counter.updateState({counter: 3})
|
||||||
|
}
|
||||||
|
|
||||||
|
toggle() {
|
||||||
|
this.updateState({validcounter: !this.state.validcounter});
|
||||||
|
}
|
||||||
|
}
|
||||||
+2
-3
@@ -1,11 +1,10 @@
|
|||||||
///<amd-module name="main" />
|
///<amd-module name="main" />
|
||||||
|
|
||||||
// import RootWidget from "./RootWidget";
|
import RootWidget from "./RootWidget";
|
||||||
import Counter from "./Counter";
|
|
||||||
import env from "./env";
|
import env from "./env";
|
||||||
|
|
||||||
document.addEventListener("DOMContentLoaded", async function() {
|
document.addEventListener("DOMContentLoaded", async function() {
|
||||||
const rootWidget = new Counter(null);
|
const rootWidget = new RootWidget(null);
|
||||||
rootWidget.setEnvironment(env);
|
rootWidget.setEnvironment(env);
|
||||||
const mainDiv = document.getElementById("app")!;
|
const mainDiv = document.getElementById("app")!;
|
||||||
await rootWidget.mount(mainDiv);
|
await rootWidget.mount(mainDiv);
|
||||||
|
|||||||
@@ -218,6 +218,25 @@ const onDirective: Directive = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const widgetDirective: Directive = {
|
||||||
|
name: "widget",
|
||||||
|
priority: 100,
|
||||||
|
atNodeEncounter({ ctx, fullName, value, node, qweb}): boolean {
|
||||||
|
let spanID = ctx.generateID();
|
||||||
|
ctx.addLine(`let ${spanID} = document.createElement('span')`);
|
||||||
|
ctx.addNode(spanID)
|
||||||
|
let props = node.getAttribute('t-props');
|
||||||
|
let widgetID = ctx.generateID();
|
||||||
|
ctx.addLine(`let ${widgetID} = new context.widgets['${value}'](context, ${props})`);
|
||||||
|
ctx.addLine(`${widgetID}.mount(${spanID}).then(()=>${ctx.parentNode}.replaceChild(${widgetID}.el, ${spanID}))`);
|
||||||
|
let ref = node.getAttribute('t-ref');
|
||||||
|
if (ref) {
|
||||||
|
ctx.addLine(`context.refs['${ref}'] = ${widgetID}`);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
export default [
|
export default [
|
||||||
forEachDirective,
|
forEachDirective,
|
||||||
ifDirective,
|
ifDirective,
|
||||||
@@ -227,5 +246,6 @@ export default [
|
|||||||
setDirective,
|
setDirective,
|
||||||
escDirective,
|
escDirective,
|
||||||
rawDirective,
|
rawDirective,
|
||||||
onDirective
|
onDirective,
|
||||||
|
widgetDirective
|
||||||
];
|
];
|
||||||
|
|||||||
+2
-2
@@ -44,6 +44,8 @@ export default class Widget {
|
|||||||
|
|
||||||
async mount(target: HTMLElement) {
|
async mount(target: HTMLElement) {
|
||||||
await this.willStart();
|
await this.willStart();
|
||||||
|
this.env!.qweb.addTemplate(this.name, this.template);
|
||||||
|
delete this.template;
|
||||||
await this.render();
|
await this.render();
|
||||||
target.appendChild(this.el!);
|
target.appendChild(this.el!);
|
||||||
}
|
}
|
||||||
@@ -56,8 +58,6 @@ export default class Widget {
|
|||||||
|
|
||||||
setEnvironment(env: Env) {
|
setEnvironment(env: Env) {
|
||||||
this.env = Object.create(env);
|
this.env = Object.create(env);
|
||||||
env.qweb.addTemplate(this.name, this.template);
|
|
||||||
delete this.template;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async updateState(newState: Object) {
|
async updateState(newState: Object) {
|
||||||
|
|||||||
Reference in New Issue
Block a user