@surface/custom-element
Version:
Provides support of directives and data binding on custom elements.
23 lines (22 loc) • 1.06 kB
JavaScript
import { throwTemplateEvaluationError, tryEvaluateExpression, } from "../common.js";
export default class EventDirective {
constructor(scope, element, descriptor) {
this.name = descriptor.name;
this.element = element;
this.action = this.evaluate(scope, descriptor);
this.element.addEventListener(this.name, this.action);
}
evaluate(scope, directive) {
const action = tryEvaluateExpression(scope, directive.expression, directive.rawExpression, directive.stackTrace);
if (!action) {
throwTemplateEvaluationError(`Evaluation error in ${directive.rawExpression}: ${directive.expression} is not defined`, directive.stackTrace);
}
if (!(action instanceof Function)) {
throwTemplateEvaluationError(`Evaluation error in ${directive.rawExpression}: ${directive.expression} is not a function`, directive.stackTrace);
}
return action;
}
dispose() {
this.element.removeEventListener(this.name, this.action);
}
}