mirror of
https://github.com/odoo/owl.git
synced 2025-10-06 19:59:41 +07:00
refactoring on types
This commit is contained in:
@@ -1,35 +1,32 @@
|
||||
import QWeb from "./qweb_vdom";
|
||||
|
||||
import { init } from "../../../libs/snabbdom/src/snabbdom";
|
||||
import sdListeners from "../../../libs/snabbdom/src/modules/eventlisteners";
|
||||
import sdAttrs from "../../../libs/snabbdom/src/modules/attributes";
|
||||
import { VNode } from "../../../libs/snabbdom/src/vnode";
|
||||
import QWeb from "./qweb_vdom";
|
||||
|
||||
const patch = init([sdListeners, sdAttrs]);
|
||||
|
||||
export interface Env {
|
||||
export interface WidgetEnv {
|
||||
qweb: QWeb;
|
||||
services: { [key: string]: any };
|
||||
[key: string]: any;
|
||||
}
|
||||
|
||||
export default class Widget {
|
||||
export default class Widget<T extends WidgetEnv> {
|
||||
name: string = "widget";
|
||||
template: string = "<div></div>";
|
||||
vnode: VNode | null = null;
|
||||
|
||||
parent: Widget | null = null;
|
||||
children: Widget[] = [];
|
||||
env: Env;
|
||||
parent: Widget<T> | null = null;
|
||||
children: Widget<T>[] = [];
|
||||
env: T;
|
||||
el: HTMLElement | null = null;
|
||||
state: Object = {};
|
||||
refs: { [key: string]: Widget } = {};
|
||||
refs: { [key: string]: Widget<T> } = {};
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// Lifecycle
|
||||
//--------------------------------------------------------------------------
|
||||
|
||||
constructor(parent: Widget | Env, props?: any) {
|
||||
constructor(parent: Widget<T> | T, props?: any) {
|
||||
if (parent instanceof Widget) {
|
||||
this.parent = parent;
|
||||
parent.children.push(this);
|
||||
@@ -99,7 +96,7 @@ export default class Widget {
|
||||
return vnode;
|
||||
}
|
||||
|
||||
private visitSubTree(callback: (w: Widget) => void) {
|
||||
private visitSubTree(callback: (w: Widget<T>) => void) {
|
||||
callback(this);
|
||||
for (let child of this.children) {
|
||||
child.visitSubTree(callback);
|
||||
|
||||
@@ -2,13 +2,15 @@ import { VNode } from "../../../libs/snabbdom/src/vnode";
|
||||
import h from "../../../libs/snabbdom/src/h";
|
||||
|
||||
export type EvalContext = { [key: string]: any };
|
||||
type RawTemplate = string;
|
||||
type ParsedTemplate = Document;
|
||||
type CompiledTemplate = (context: EvalContext) => VNode;
|
||||
export type RawTemplate = string;
|
||||
export type CompiledTemplate<T> = (context: EvalContext) => T;
|
||||
|
||||
const RESERVED_WORDS = "true,false,NaN,null,undefined,debugger,console,window,in,instanceof,new,function,return,this,typeof,eval,void,Math,RegExp,Array,Object,Date".split(
|
||||
","
|
||||
);
|
||||
|
||||
type ParsedTemplate = Document;
|
||||
|
||||
// Compilation Context
|
||||
export class Context {
|
||||
nextID: number = 1;
|
||||
@@ -84,7 +86,7 @@ export class Context {
|
||||
export default class QWeb {
|
||||
rawTemplates: { [name: string]: RawTemplate } = {};
|
||||
parsedTemplates: { [name: string]: ParsedTemplate } = {};
|
||||
templates: { [name: string]: CompiledTemplate } = {};
|
||||
templates: { [name: string]: CompiledTemplate<VNode> } = {};
|
||||
h = h;
|
||||
exprCache: { [key: string]: string } = {};
|
||||
directives: Directive[] = [];
|
||||
@@ -183,7 +185,7 @@ export default class QWeb {
|
||||
return template(context);
|
||||
}
|
||||
|
||||
_compile(name: string): CompiledTemplate {
|
||||
_compile(name: string): CompiledTemplate<VNode> {
|
||||
if (name in this.templates) {
|
||||
return this.templates[name];
|
||||
}
|
||||
@@ -205,10 +207,9 @@ export default class QWeb {
|
||||
`Template: ${this.rawTemplates[name]}\nCompiled code:\n` + functionCode
|
||||
);
|
||||
}
|
||||
const template: CompiledTemplate = (new Function(
|
||||
"context",
|
||||
functionCode
|
||||
) as CompiledTemplate).bind(this);
|
||||
const template = (new Function("context", functionCode) as CompiledTemplate<
|
||||
VNode
|
||||
>).bind(this);
|
||||
this.templates[name] = template;
|
||||
return template;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user