-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathbindify.min.js
More file actions
16 lines (16 loc) · 2.29 KB
/
bindify.min.js
File metadata and controls
16 lines (16 loc) · 2.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
(function($){$.fn.bindify=function(data={},options={}){let settings=$.extend({prefix:'binding',updateModel:!0,updateDOM:!0,updateCallback:$.Callbacks(),debug:!1,updateEvent:'input',onUpdate:function(data){},},options);let el=this;let updateDOM=function(){setTimeout(function(){bind(el,data)},0)}
settings.updateCallback.add(updateDOM);let prefix=settings.prefix+'-';if(settings.updateModel)
$(el).find('[data-'+prefix+'value]').each(function(){$(this).off(settings.updateEvent);$(this).on(settings.updateEvent,function(){if(settings.debug)
console.log("Input event fired: "+this.value);assign(data,$(this).data(prefix+'value'),this.value);settings.onUpdate(data);settings.updateCallback.fire()})});let assign=function(obj,prop,value){if(typeof prop==="string")
prop=prop.split(".");if(prop.length>1){var e=prop.shift();assign(obj[e]=Object.prototype.toString.call(obj[e])==="[object Object]"?obj[e]:{},prop,value)}else obj[prop[0]]=value}
let getData=function(key,data){function index(obj,i){return obj[i]}
return key.split('.').reduce(index,data)}
let bind=function(element,data){let dataValue=element.data(prefix+'value');if(dataValue){element.val(getData(dataValue,data))}
let dataText=element.data(prefix+'text');if(dataText)
element.text(getData(dataText,data));let dataAttributes=element.data(prefix+'attributes');if(dataAttributes){Object.keys(dataAttributes).forEach(function(key){element.attr(key,getData(dataAttributes[key],data))},this)}
let dataList=element.data(prefix+'list');if(dataList){let eachData=getData(dataList,data);let children=$(element).children();let firstChild=children.first();let isLength=children.length;let shouldLength=eachData.length;if(isLength>0)
{for(let i=isLength+1;i<=shouldLength;i++)
firstChild.clone().appendTo(element);for(let i=shouldLength+1;i<=isLength;i++)
element.children().last().remove();let key=dataList;let dataVar=element.data(prefix+'var');if(dataVar)
key=dataVar;for(let i=0;i<eachData.length;i++){let childData={};childData[key]=eachData[i];let computedDataForChild=Object.assign({},data,childData);bind(children.eq(i),computedDataForChild)}}}
else{$(element).children().each(function(){bind($(this),data)})}};settings.updateCallback.fire();return this}}(jQuery))