forked from mxriverlynn/backbone.modelbinding
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbackbone.modelbinding.min.js
19 lines (19 loc) · 6.22 KB
/
backbone.modelbinding.min.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Backbone.ModelBinding v0.4.0
//
// Copyright (C)2011 Derick Bailey, Muted Solutions, LLC
// Distributed Under MIT Liscene
//
// Documentation and Full Licence Availabe at:
// http://github.com/derickbailey/backbone.modelbinding
Backbone.ModelBinding=function(j,i,l){modelBinding={version:"0.4.0",bind:function(a,d){a.modelBinder=new ModelBinder(a,d);a.modelBinder.bind()},unbind:function(a){a.modelBinder&&a.modelBinder.unbind()}};ModelBinder=function(a,d){this.config=new modelBinding.Configuration(d);this.modelBindings=[];this.elementBindings=[];this.bind=function(){var c=modelBinding.Conventions,b;for(b in c)if(c.hasOwnProperty(b)){var e=c[b];e.handler.bind.call(this,e.selector,a,a.model,this.config)}};this.unbind=function(){i.each(this.elementBindings,
function(c){c.element.unbind(c.eventName,c.callback)});i.each(this.modelBindings,function(c){c.model.unbind(c.eventName,c.callback)})};this.registerModelBinding=function(c,b,e){b="change:"+b;c.bind(b,e);this.modelBindings.push({model:c,eventName:b,callback:e})};this.registerElementBinding=function(c,b){c.bind("change",b);this.elementBindings.push({element:c,eventName:"change",callback:b})}};modelBinding.Configuration=function(a){this.bindingAttrConfig={};i.extend(this.bindingAttrConfig,modelBinding.Configuration.bindindAttrConfig,
a);if(this.bindingAttrConfig.all){a=this.bindingAttrConfig.all;delete this.bindingAttrConfig.all;for(var d in this.bindingAttrConfig)this.bindingAttrConfig.hasOwnProperty(d)&&(this.bindingAttrConfig[d]=a)}this.getBindingAttr=function(c){return this.bindingAttrConfig[c]};this.getBindingValue=function(c,b){var e=this.getBindingAttr(b);return c.attr(e)}};modelBinding.Configuration.bindindAttrConfig={text:"id",textarea:"id",password:"id",radio:"name",checkbox:"id",select:"id"};modelBinding.Configuration.store=
function(){modelBinding.Configuration.originalConfig=i.clone(modelBinding.Configuration.bindindAttrConfig)};modelBinding.Configuration.restore=function(){modelBinding.Configuration.bindindAttrConfig=modelBinding.Configuration.originalConfig};modelBinding.Configuration.configureBindingAttributes=function(a){a.all&&(this.configureAllBindingAttributes(a.all),delete a.all);i.extend(modelBinding.Configuration.bindindAttrConfig,a)};modelBinding.Configuration.configureAllBindingAttributes=function(a){var d=
modelBinding.Configuration.bindindAttrConfig;d.text=a;d.textarea=a;d.password=a;d.radio=a;d.checkbox=a;d.select=a};StandardBinding=function(){var a={},d=function(c){var b=c[0].tagName.toLowerCase();if(b=="input"&&(b=c.attr("type"),b==void 0||b==""))b="text";return b};a.bind=function(c,b,e,a){var f=this;b.$(c).each(function(){var c=b.$(this),h=d(c),k=a.getBindingValue(c,h);f.registerModelBinding(e,k,function(f,b){c.val(b)});f.registerElementBinding(c,function(c){var f={};f[k]=b.$(c.target).val();e.set(f)});
h=e.get(k);typeof h!=="undefined"&&h!==null&&c.val(h)})};return a}(j);SelectBoxBinding=function(){return{bind:function(a,d,c,b){var e=this;d.$(a).each(function(){var a=d.$(this),f=b.getBindingValue(a,"select");e.registerModelBinding(c,f,function(c,f){a.val(f)});e.registerElementBinding(a,function(a){var b={},a=d.$(a.target);b[f]=a.val();b[f+"_text"]=a.find(":selected").text();c.set(b)});var g=c.get(f);typeof g!=="undefined"&&g!==null&&(a.val(g),a.val()!=g&&(g={},g[f]=a.val(),c.set(g)))})}}}(j);RadioGroupBinding=
function(){return{bind:function(a,d,c,b){var e=this,m=[];d.$(a).each(function(){var a=d.$(this),g=b.getBindingValue(a,"radio");if(!m[g]){m[g]=true;var h=b.getBindingAttr("radio");e.registerModelBinding(c,g,function(a,c){d.$("input[type=radio]["+h+"="+g+"][value="+c+"]").attr("checked","checked")});var k=function(a){a=d.$(a.currentTarget);if(a.is(":checked")){var b={};b[g]=a.val();c.set(b)}};d.$("input[type=radio]["+h+"="+g+"]").each(function(){var a=l(this);e.registerElementBinding(a,k)});a=c.get(g);
typeof a!=="undefined"&&a!==null&&d.$("input[type=radio]["+h+"="+g+"][value="+a+"]").attr("checked","checked")}})}}}(j);CheckboxBinding=function(){return{bind:function(a,d,c,b){var e=this;d.$(a).each(function(){var a=d.$(this);b.getBindingAttr("checkbox");var f=b.getBindingValue(a,"checkbox");e.registerModelBinding(c,f,function(c,b){b?a.attr("checked","checked"):a.removeAttr("checked")});e.registerElementBinding(a,function(a){var b={},a=d.$(a.target).is(":checked")?true:false;b[f]=a;c.set(b)});if(c.attributes.hasOwnProperty(f)){var g=
c.get(f);typeof g!=="undefined"&&g!==null&&g!=false?a.attr("checked","checked"):a.removeAttr("checked")}})}}}(j);DataBindBinding=function(a,d,c){var b={"default":""};modelBinding.Configuration.dataBindSubst=function(a){this.storeDataBindSubstConfig();d.extend(b,a)};modelBinding.Configuration.storeDataBindSubstConfig=function(){modelBinding.Configuration._dataBindSubstConfig=d.clone(b)};modelBinding.Configuration.restoreDataBindSubstConfig=function(){if(modelBinding.Configuration._dataBindSubstConfig)b=
modelBinding.Configuration._dataBindSubstConfig,delete modelBinding.Configuration._dataBindSubstConfig};modelBinding.Configuration.getDataBindSubst=function(a,c){var f=c;c===void 0&&(f=b.hasOwnProperty(a)?b[a]:b["default"]);return f};setOnElement=function(a,c,b){b=modelBinding.Configuration.getDataBindSubst(c,b);switch(c){case "html":a.html(b);break;case "text":a.text(b);break;case "enabled":a.attr("disabled",!b);break;case "displayed":a[b?"show":"hide"]();break;case "hidden":a[b?"hide":"show"]();
break;default:a.attr(c,b)}};splitBindingAttr=function(a){var b=[],a=a.attr("data-bind").split(";");d.each(a,function(a){a=c.trim(a).split(" ");a.length==1&&a.unshift("text");b.push({elementAttr:a[0],modelAttr:a[1]})});return b};return{bind:function(a,b,c){var g=this;b.$(a).each(function(){var a=b.$(this),e=splitBindingAttr(a);d.each(e,function(b){g.registerModelBinding(c,b.modelAttr,function(c,d){setOnElement(a,b.elementAttr,d)});setOnElement(a,b.elementAttr,c.get(b.modelAttr))})})}}}(j,i,l);modelBinding.Conventions=
{text:{selector:"input:text",handler:StandardBinding},textarea:{selector:"textarea",handler:StandardBinding},password:{selector:"input:password",handler:StandardBinding},radio:{selector:"input:radio",handler:RadioGroupBinding},checkbox:{selector:"input:checkbox",handler:CheckboxBinding},select:{selector:"select",handler:SelectBoxBinding},databind:{selector:"*[data-bind]",handler:DataBindBinding}};return modelBinding}(Backbone,_,jQuery);