[IMP] add t-mounted directive

closes #45
This commit is contained in:
Aaron Bohy
2019-05-10 15:03:54 +02:00
committed by Géry Debongnie
parent 8ee0973dab
commit 0aba9748c9
4 changed files with 104 additions and 1 deletions
+7 -1
View File
@@ -40,6 +40,7 @@ export interface Meta<T extends Env, Props> {
boundHandlers: { [key: number]: any };
observer?: Observer;
render?: CompiledTemplate;
mountedHandlers: { [key: number]: Function };
}
//------------------------------------------------------------------------------
@@ -119,7 +120,8 @@ export class Component<
renderId: 1,
renderPromise: null,
renderProps: props || null,
boundHandlers: {}
boundHandlers: {},
mountedHandlers: {}
};
}
@@ -226,6 +228,9 @@ export class Component<
}
}
this.__owl__.isMounted = true;
for (let key in this.__owl__.mountedHandlers) {
this.__owl__.mountedHandlers[key]();
}
this.mounted();
}
@@ -400,6 +405,7 @@ export class Component<
let vnode = this.__owl__.render!(this, {
promises,
handlers: this.__owl__.boundHandlers,
mountedHandlers: this.__owl__.mountedHandlers,
forceUpdate: force,
patchQueue
});
+39
View File
@@ -10,6 +10,7 @@ import { QWeb, UTILS } from "./qweb_core";
* - t-ref
* - t-transition
* - t-widget/t-props/t-keepalive
* - t-mounted
*/
//------------------------------------------------------------------------------
@@ -325,3 +326,41 @@ QWeb.addDirective({
return true;
}
});
//------------------------------------------------------------------------------
// t-mounted
//------------------------------------------------------------------------------
QWeb.addDirective({
name: "mounted",
priority: 97,
atNodeCreation({ ctx, fullName, value, nodeID }) {
ctx.rootContext.shouldDefineOwner = true;
const eventName = fullName.slice(5);
if (!eventName) {
throw new Error("Missing event name with t-on directive");
}
let extraArgs;
let handler = value.replace(/\(.*\)/, function(args) {
extraArgs = args.slice(1, -1);
return "";
});
let error = `(function () {throw new Error('Missing handler \\'' + '${handler}' + \`\\' when evaluating template '${ctx.templateName.replace(
/`/g,
"'"
)}'\`)})()`;
if (extraArgs) {
ctx.addLine(
`extra.mountedHandlers[${nodeID}] = (context['${handler}'] || ${error}).bind(owner, ${ctx.formatExpression(
extraArgs
)});`
);
} else {
ctx.addLine(
`extra.mountedHandlers[${nodeID}] = extra.mountedHandlers[${nodeID}] || (context['${handler}'] || ${error}).bind(owner);`
);
}
ctx.addLine(`p${nodeID}.hook = {
insert: (vn) => { if (context.__owl__.isMounted) { extra.mountedHandlers[${nodeID}](); } },
};`);
}
});