|
|
@ -633,35 +633,10 @@ export default class ElementWrapper extends Wrapper {
|
|
|
|
const { component } = renderer;
|
|
|
|
const { component } = renderer;
|
|
|
|
|
|
|
|
|
|
|
|
this.node.handlers.forEach(handler => {
|
|
|
|
this.node.handlers.forEach(handler => {
|
|
|
|
const { isCustomEvent } = handler;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// get a name for the event handler that is globally unique
|
|
|
|
|
|
|
|
const handler_name = component.getUniqueName(
|
|
|
|
|
|
|
|
`${handler.name.replace(/[^a-zA-Z0-9_$]/g, '_')}_handler`
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const component_name = block.alias('component'); // can't use #component, might be hoisted
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (isCustomEvent) {
|
|
|
|
|
|
|
|
throw new Error(`TODO figure out custom events`);
|
|
|
|
|
|
|
|
block.addVariable(handler_name);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
block.builders.hydrate.addBlock(deindent`
|
|
|
|
|
|
|
|
${handler_name} = ctx.${handler.name}.call(${component_name}, ${this.var}, function(event) {
|
|
|
|
|
|
|
|
${handler.snippet}
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
`);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
block.builders.destroy.addLine(deindent`
|
|
|
|
|
|
|
|
${handler_name}.destroy();
|
|
|
|
|
|
|
|
`);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
const modifiers = [];
|
|
|
|
const modifiers = [];
|
|
|
|
if (handler.modifiers.has('preventDefault')) modifiers.push('event.preventDefault();');
|
|
|
|
if (handler.modifiers.has('preventDefault')) modifiers.push('event.preventDefault();');
|
|
|
|
if (handler.modifiers.has('stopPropagation')) modifiers.push('event.stopPropagation();');
|
|
|
|
if (handler.modifiers.has('stopPropagation')) modifiers.push('event.stopPropagation();');
|
|
|
|
|
|
|
|
|
|
|
|
let name = handler.expression.snippet;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const opts = ['passive', 'once', 'capture'].filter(mod => handler.modifiers.has(mod));
|
|
|
|
const opts = ['passive', 'once', 'capture'].filter(mod => handler.modifiers.has(mod));
|
|
|
|
if (opts.length) {
|
|
|
|
if (opts.length) {
|
|
|
|
const optString = (opts.length === 1 && opts[0] === 'capture')
|
|
|
|
const optString = (opts.length === 1 && opts[0] === 'capture')
|
|
|
@ -669,26 +644,27 @@ export default class ElementWrapper extends Wrapper {
|
|
|
|
: `{ ${opts.map(opt => `${opt}: true`).join(', ')} }`;
|
|
|
|
: `{ ${opts.map(opt => `${opt}: true`).join(', ')} }`;
|
|
|
|
|
|
|
|
|
|
|
|
block.builders.hydrate.addLine(
|
|
|
|
block.builders.hydrate.addLine(
|
|
|
|
`@addListener(${this.var}, "${handler.name}", ${name}, ${optString});`
|
|
|
|
`@addListener(${this.var}, "${handler.name}", ${handler.snippet}, ${optString});`
|
|
|
|
);
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
block.builders.destroy.addLine(
|
|
|
|
block.builders.destroy.addLine(
|
|
|
|
`@removeListener(${this.var}, "${handler.name}", ${name}, ${optString});`
|
|
|
|
`@removeListener(${this.var}, "${handler.name}", ${handler.snippet}, ${optString});`
|
|
|
|
);
|
|
|
|
);
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
block.builders.hydrate.addLine(
|
|
|
|
block.builders.hydrate.addLine(
|
|
|
|
`@addListener(${this.var}, "${handler.name}", ${name});`
|
|
|
|
`@addListener(${this.var}, "${handler.name}", ${handler.snippet});`
|
|
|
|
);
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
block.builders.destroy.addLine(
|
|
|
|
block.builders.destroy.addLine(
|
|
|
|
`@removeListener(${this.var}, "${handler.name}", ${name});`
|
|
|
|
`@removeListener(${this.var}, "${handler.name}", ${handler.snippet});`
|
|
|
|
);
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (handler.expression) {
|
|
|
|
handler.expression.declarations.forEach(declaration => {
|
|
|
|
handler.expression.declarations.forEach(declaration => {
|
|
|
|
block.builders.init.addBlock(declaration);
|
|
|
|
block.builders.init.addBlock(declaration);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|