UNPKG

bindom

Version:

Tiny, powerful data binding & web application framework

48 lines (40 loc) 1.39 kB
import {addClass, hasClass} from './classRegistry.mjs'; import {insertAndBindTemplate} from './insertTemplate.mjs'; const map = new WeakMap(); customElements.define('loop-dom', class extends HTMLTemplateElement { constructor(...arg) { const self = super(...arg); defaultLoopClass(self); return self; } get array() {return map.get(this);} set array(array) { const updateStrategy = handleUpdateStrategy(this, array); if(updateStrategy === 'skip') return; map.set(this, array); defaultLoopClass(this); insertAndBindTemplate(this, options(this, array, updateStrategy)); } }, {extends: 'template'}); function defaultLoopClass(loop) { if(!loop.hasAttribute('data-class')) { if(!hasClass('Object')) addClass(Object); loop.setAttribute('data-class', 'Object'); } } function handleUpdateStrategy(template, array) { const [ar, el] = (template.dataset.update && template.dataset.update.split(',')) || []; if(!ar) return; if((ar === 'unidentical') && (array === map.get(template))) return 'skip'; return el || ar; } function options(loop, array, updateStrategy) { const toItem = item => (typeof item === 'object' ? item : {item: item}); const opt = {array: array.map(toItem)}; if(updateStrategy) opt.updateStrategy = updateStrategy; if(loop.hasAttribute('data-chunks')) { opt.chunks = parseInt(loop.getAttribute('data-chunks'), 10); } return opt; }