t-widget directive

This commit is contained in:
Géry Debongnie
2019-01-20 14:46:36 +01:00
parent d0bdf0ed8b
commit e40c9ee4e5
6 changed files with 67 additions and 35 deletions
+24 -19
View File
@@ -96,7 +96,8 @@ export default class QWeb {
elifDirective,
ifDirective,
callDirective,
onDirective
onDirective,
widgetDirective
].forEach(d => this.addDirective(d));
}
@@ -641,21 +642,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;
// }
// };
const widgetDirective: Directive = {
name: "widget",
priority: 100,
atNodeEncounter({ ctx, fullName, value, node, qweb}): boolean {
let dummyID = ctx.generateID();
let defID = ctx.generateID();
ctx.addLine(`let _${dummyID} = {} // DUMMY`);
ctx.addLine(`c${ctx.parentNode}.push(_${dummyID})`);
let props = node.getAttribute('t-props');
let widgetID = ctx.generateID();
ctx.addLine(`let _${widgetID} = new context.widgets['${value}'](context, ${props})`);
ctx.addLine(`let def${defID} = _${widgetID}.mount().then(vnode=>Object.assign(_${dummyID}, vnode))`);
ctx.addLine(`context._TEMP.push(def${defID})`);
// split into extra directive?
let ref = node.getAttribute('t-ref');
if (ref) {
ctx.addLine(`context.refs['${ref}'] = _${widgetID}`);
}
return true;
}
};