UNPKG

mnster

Version:

Simple and small data binding library

1 lines 3.3 kB
!function(e,t){"use strict";"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?module.exports=t:e.mnster=t(e)}(this,function(e){"use strict";var t={},n="mns",r=/^(mns-)/,o=/(\-[a-zA-Z0-9]+)+/,l=function(e,t){for(var n=t.split("."),r=e,o=0,l=n.length;l>o;o++){if("undefined"==typeof r[n[o]]||null===r[n[o]])return null;r=r[n[o]]}return r},i=function(e){for(;e.firstChild;)e.removeChild(e.firstChild);e.innerText&&(e.innerText="")},a=function(t){var n=this;n.template=t.template,n.model={},n.model[t.context]=t.model,n.controller=t.controller||e,n.bindModel()};a.prototype.bindModel=function(){var e=this,t=0;for(e.nodes=e.template.querySelectorAll("*"),e.bindNode(e.template),t=e.nodes.length;t;)e.bindNode(e.nodes[--t]);t=null},a.prototype.bindNode=function(e){for(var n,i,a,d=this,u=e.attributes,s=u&&u.length?u.length:0;s;)if(n=u[--s],i=n.name,a=i.replace(r,"").replace(o,""),r.test(i)&&t[a])try{t[a]({node:e,attribute:n.name,value:n.value,valueFromModel:l(d.model,n.value),controller:d.controller})}catch(c){console.log("mnster binding error: "+c)}u=s=n=i=a=null},a.prototype.update=function(){var e=this,t=0;for(e.bindNode(e.template),t=e.nodes.length;t;)e.bindNode(e.nodes[--t]);t=null};var d=function(e,t){if(!e||!e.nodeType)throw new Error("mnster.view: You must pass a valid template as a first argument");if(!t||!t.context||!t.model)throw new Error("mnster.view: You must specify a context and a model");var n=new a({template:e,context:t.context,model:t.model,controller:t.controller});return n},u=function(e,n){if("string"!=typeof e)throw new Error("mnster.binding: name must be a string");if("function"!=typeof n)throw new Error("mnster.binding: you must specify a method");if(t[e])throw new Error("mnster.binding: a binding with this name already exists");t[e]=n},s=function(e){if("string"!=typeof e)throw new Error("mnster.clean: name must be a string");t[e]&&(t[e]=null)},c=function(e){if("string"!=typeof e||""===e)throw new Error("mnster.prefix: prefix must be a populated string");n=e,r=new RegExp("^("+e+")-")};return u("text",function(e){var t=e.node,n=e.valueFromModel,r=t.innerText?"innerText":"textContent";t[r]=null!==n?n+"":""}),u("html",function(e){var t=e.node,n=e.valueFromModel;t.innerHTML=null!==n?n+"":""}),u("attr",function(e){var t=e.node,r=e.attribute.replace(n+"-attr-",""),o=e.valueFromModel;r&&null!==o&&t.setAttribute(r,o+"")}),u("data",function(e){var t=e.node,r=e.attribute.replace(n+"-",""),o=e.valueFromModel;r.replace("data-","")&&null!==o&&t.setAttribute(r,o+"")}),u("show",function(e){e.node.style.display=e.valueFromModel?"block":"none"}),u("hide",function(e){e.node.style.display=e.valueFromModel?"none":"block"}),u("on",function(e){var t=e.controller[e.value],r=e.attribute.replace(n+"-on-","");"function"==typeof t&&e.node.addEventListener(r,t,!1)}),u("each",function(e){var t,r,o,l=e.node,d=e.valueFromModel,u=e.attribute.replace(n+"-each-","");l.__mnsterEachTemplate__||(l.__mnsterEachTemplate__=document.createElement("div"),l.__mnsterEachTemplate__.innerHTML=l.innerHTML),i(l);for(var s in d)d.hasOwnProperty(s)&&(o=document.createElement("div"),o.innerHTML=l.__mnsterEachTemplate__.innerHTML,r=d[s]||{},t=new a({template:o,context:u,model:r}),l.innerHTML+=o.innerHTML);t=r=o=null}),{view:d,binding:u,clean:s,prefix:c}});