UNPKG

@purtuga/dom-data-bind

Version:

DOM Data Bind utility. Bind data to DOM

62 lines (55 loc) 1.94 kB
import {DomDataBindElement} from "./DomDataBindElement.js"; //====================================================================== const DomDataBindEleProto = DomDataBindElement.prototype; const memberToApply = [ "_setView", "addToState", "state" ]; /** * Decorates a sub-class of `@purtuga/ComponentElement` so that rendered content * uses data binding. (essentially, copies the methods from `DomDataBindElement` * to the given class. * * @param {Object} [optionsOrClassDescriptor] * @param {Array} [optionsOrClassDescriptor.directives] * * @returns {function(*): *} * * @example * * @dataBoundTemplates() * class NewElement extends ComponentElement {} */ export function dataBoundTemplates(optionsOrClassDescriptor) { const opt = optionsOrClassDescriptor; function applyDirectiveToClass(classDescriptor) { memberToApply.forEach(memberName => { classDescriptor.elements.push({ key: memberName, kind: "method", placement: "prototype", descriptor: Object.getOwnPropertyDescriptor(DomDataBindEleProto, memberName) }); }); // Add directive list if one was set if (opt && opt.directives) { classDescriptor.elements.push({ kind: "field", key: "directives", placement: "static", descriptor: { configurable: true }, initializer() { return opt.directives; } }); } return classDescriptor } // If this is being called with the actual Class decoratorDescriptor, // then decorate the class if (optionsOrClassDescriptor && optionsOrClassDescriptor.kind) { applyDirectiveToClass(optionsOrClassDescriptor); } return applyDirectiveToClass; }