updating fork
Showing
6 changed files
with
231 additions
and
89 deletions
... | @@ -2,8 +2,8 @@ | ... | @@ -2,8 +2,8 @@ |
2 | "name": "rivets", | 2 | "name": "rivets", |
3 | "repo": "mikeric/rivets", | 3 | "repo": "mikeric/rivets", |
4 | "description": "Declarative data binding facility.", | 4 | "description": "Declarative data binding facility.", |
5 | "version": "0.4.5", | 5 | "version": "0.4.8", |
6 | "keywords": ["data binding", "template"], | 6 | "keywords": ["data binding", "templating"], |
7 | "scripts": ["lib/rivets.js"], | 7 | "scripts": ["lib/rivets.js"], |
8 | "main": "lib/rivets.js", | 8 | "main": "lib/rivets.js", |
9 | "license": "MIT" | 9 | "license": "MIT" | ... | ... |
1 | // rivets.js | 1 | // rivets.js |
2 | // version: 0.4.5 | 2 | // version: 0.4.8 |
3 | // author: Michael Richards | 3 | // author: Michael Richards |
4 | // license: MIT | 4 | // license: MIT |
5 | (function() { | 5 | (function() { |
6 | var Rivets, bindEvent, getInputValue, rivets, unbindEvent, | 6 | var Rivets, bindEvent, factory, getInputValue, unbindEvent, |
7 | __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, | 7 | __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, |
8 | __slice = [].slice, | 8 | __slice = [].slice, |
9 | __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; | 9 | __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; |
... | @@ -405,21 +405,31 @@ | ... | @@ -405,21 +405,31 @@ |
405 | 405 | ||
406 | getInputValue = function(el) { | 406 | getInputValue = function(el) { |
407 | var o, _i, _len, _results; | 407 | var o, _i, _len, _results; |
408 | switch (el.type) { | 408 | if (window.jQuery != null) { |
409 | case 'checkbox': | 409 | el = jQuery(el); |
410 | return el.checked; | 410 | switch (el[0].type) { |
411 | case 'select-multiple': | 411 | case 'checkbox': |
412 | _results = []; | 412 | return el.is(':checked'); |
413 | for (_i = 0, _len = el.length; _i < _len; _i++) { | 413 | default: |
414 | o = el[_i]; | 414 | return el.val(); |
415 | if (o.selected) { | 415 | } |
416 | _results.push(o.value); | 416 | } else { |
417 | switch (el.type) { | ||
418 | case 'checkbox': | ||
419 | return el.checked; | ||
420 | case 'select-multiple': | ||
421 | _results = []; | ||
422 | for (_i = 0, _len = el.length; _i < _len; _i++) { | ||
423 | o = el[_i]; | ||
424 | if (o.selected) { | ||
425 | _results.push(o.value); | ||
426 | } | ||
417 | } | 427 | } |
418 | } | 428 | return _results; |
419 | return _results; | 429 | break; |
420 | break; | 430 | default: |
421 | default: | 431 | return el.value; |
422 | return el.value; | 432 | } |
423 | } | 433 | } |
424 | }; | 434 | }; |
425 | 435 | ||
... | @@ -439,8 +449,9 @@ | ... | @@ -439,8 +449,9 @@ |
439 | return unbindEvent(el, 'change', this.currentListener); | 449 | return unbindEvent(el, 'change', this.currentListener); |
440 | }, | 450 | }, |
441 | routine: function(el, value) { | 451 | routine: function(el, value) { |
452 | var _ref; | ||
442 | if (el.type === 'radio') { | 453 | if (el.type === 'radio') { |
443 | return el.checked = el.value === value; | 454 | return el.checked = ((_ref = el.value) != null ? _ref.toString() : void 0) === (value != null ? value.toString() : void 0); |
444 | } else { | 455 | } else { |
445 | return el.checked = !!value; | 456 | return el.checked = !!value; |
446 | } | 457 | } |
... | @@ -455,8 +466,9 @@ | ... | @@ -455,8 +466,9 @@ |
455 | return unbindEvent(el, 'change', this.currentListener); | 466 | return unbindEvent(el, 'change', this.currentListener); |
456 | }, | 467 | }, |
457 | routine: function(el, value) { | 468 | routine: function(el, value) { |
469 | var _ref; | ||
458 | if (el.type === 'radio') { | 470 | if (el.type === 'radio') { |
459 | return el.checked = el.value !== value; | 471 | return el.checked = ((_ref = el.value) != null ? _ref.toString() : void 0) !== (value != null ? value.toString() : void 0); |
460 | } else { | 472 | } else { |
461 | return el.checked = !value; | 473 | return el.checked = !value; |
462 | } | 474 | } |
... | @@ -480,18 +492,25 @@ | ... | @@ -480,18 +492,25 @@ |
480 | return unbindEvent(el, 'change', this.currentListener); | 492 | return unbindEvent(el, 'change', this.currentListener); |
481 | }, | 493 | }, |
482 | routine: function(el, value) { | 494 | routine: function(el, value) { |
483 | var o, _i, _len, _ref, _results; | 495 | var o, _i, _len, _ref, _ref1, _ref2, _results; |
484 | if (el.type === 'select-multiple') { | 496 | if (window.jQuery != null) { |
485 | if (value != null) { | 497 | el = jQuery(el); |
486 | _results = []; | 498 | if ((value != null ? value.toString() : void 0) !== ((_ref = el.val()) != null ? _ref.toString() : void 0)) { |
487 | for (_i = 0, _len = el.length; _i < _len; _i++) { | 499 | return el.val(value != null ? value : ''); |
488 | o = el[_i]; | ||
489 | _results.push(o.selected = (_ref = o.value, __indexOf.call(value, _ref) >= 0)); | ||
490 | } | ||
491 | return _results; | ||
492 | } | 500 | } |
493 | } else { | 501 | } else { |
494 | return el.value = value != null ? value : ''; | 502 | if (el.type === 'select-multiple') { |
503 | if (value != null) { | ||
504 | _results = []; | ||
505 | for (_i = 0, _len = el.length; _i < _len; _i++) { | ||
506 | o = el[_i]; | ||
507 | _results.push(o.selected = (_ref1 = o.value, __indexOf.call(value, _ref1) >= 0)); | ||
508 | } | ||
509 | return _results; | ||
510 | } | ||
511 | } else if ((value != null ? value.toString() : void 0) !== ((_ref2 = el.value) != null ? _ref2.toString() : void 0)) { | ||
512 | return el.value = value != null ? value : ''; | ||
513 | } | ||
495 | } | 514 | } |
496 | } | 515 | } |
497 | }, | 516 | }, |
... | @@ -581,11 +600,11 @@ | ... | @@ -581,11 +600,11 @@ |
581 | 600 | ||
582 | Rivets.formatters = {}; | 601 | Rivets.formatters = {}; |
583 | 602 | ||
584 | rivets = { | 603 | factory = function(exports) { |
585 | binders: Rivets.binders, | 604 | exports.binders = Rivets.binders; |
586 | formatters: Rivets.formatters, | 605 | exports.formatters = Rivets.formatters; |
587 | config: Rivets.config, | 606 | exports.config = Rivets.config; |
588 | configure: function(options) { | 607 | exports.configure = function(options) { |
589 | var property, value; | 608 | var property, value; |
590 | if (options == null) { | 609 | if (options == null) { |
591 | options = {}; | 610 | options = {}; |
... | @@ -594,8 +613,8 @@ | ... | @@ -594,8 +613,8 @@ |
594 | value = options[property]; | 613 | value = options[property]; |
595 | Rivets.config[property] = value; | 614 | Rivets.config[property] = value; |
596 | } | 615 | } |
597 | }, | 616 | }; |
598 | bind: function(el, models) { | 617 | return exports.bind = function(el, models) { |
599 | var view; | 618 | var view; |
600 | if (models == null) { | 619 | if (models == null) { |
601 | models = {}; | 620 | models = {}; |
... | @@ -603,13 +622,18 @@ | ... | @@ -603,13 +622,18 @@ |
603 | view = new Rivets.View(el, models); | 622 | view = new Rivets.View(el, models); |
604 | view.bind(); | 623 | view.bind(); |
605 | return view; | 624 | return view; |
606 | } | 625 | }; |
607 | }; | 626 | }; |
608 | 627 | ||
609 | if (typeof module !== "undefined" && module !== null) { | 628 | if (typeof exports === 'object') { |
610 | module.exports = rivets; | 629 | factory(exports); |
630 | } else if (typeof define === 'function' && define.amd) { | ||
631 | define(['exports'], function(exports) { | ||
632 | factory(this.rivets = exports); | ||
633 | return exports; | ||
634 | }); | ||
611 | } else { | 635 | } else { |
612 | this.rivets = rivets; | 636 | factory(this.rivets = {}); |
613 | } | 637 | } |
614 | 638 | ||
615 | }).call(this); | 639 | }).call(this); | ... | ... |
1 | // rivets.js | 1 | // rivets.js |
2 | // version: 0.4.5 | 2 | // version: 0.4.8 |
3 | // author: Michael Richards | 3 | // author: Michael Richards |
4 | // license: MIT | 4 | // license: MIT |
5 | (function(){var e,t,n,r,i,s=function(e,t){return function(){return e.apply(t,arguments)}},o=[].slice,u=[].indexOf||function(e){for(var t=0,n=this.length;t<n;t++)if(t in this&&this[t]===e)return t;return-1};e={},String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}),e.Binding=function(){function t(t,n,r,i,o){var u,a,f,l;this.el=t,this.type=n,this.model=r,this.keypath=i,this.options=o!=null?o:{},this.unbind=s(this.unbind,this),this.bind=s(this.bind,this),this.publish=s(this.publish,this),this.sync=s(this.sync,this),this.set=s(this.set,this),this.formattedValue=s(this.formattedValue,this);if(!(this.binder=e.binders[n])){l=e.binders;for(u in l)f=l[u],u!=="*"&&u.indexOf("*")!==-1&&(a=new RegExp("^"+u.replace("*",".+")+"$"),a.test(n)&&(this.binder=f,this.args=(new RegExp("^"+u.replace("*","(.+)")+"$")).exec(n),this.args.shift()))}this.binder||(this.binder=e.binders["*"]),this.binder instanceof Function&&(this.binder={routine:this.binder}),this.formatters=this.options.formatters||[]}return t.prototype.formattedValue=function(t){var n,r,i,s,u,a;a=this.formatters;for(s=0,u=a.length;s<u;s++)r=a[s],n=r.split(/\s+/),i=n.shift(),r=this.model[i]instanceof Function?this.model[i]:e.formatters[i],(r!=null?r.read:void 0)instanceof Function?t=r.read.apply(r,[t].concat(o.call(n))):r instanceof Function&&(t=r.apply(null,[t].concat(o.call(n))));return t},t.prototype.set=function(e){var t;return e=e instanceof Function&&!this.binder["function"]?this.formattedValue(e.call(this.model)):this.formattedValue(e),(t=this.binder.routine)!=null?t.call(this,this.el,e):void 0},t.prototype.sync=function(){return this.set(this.options.bypass?this.model[this.keypath]:e.config.adapter.read(this.model,this.keypath))},t.prototype.publish=function(){var t,r,i,s,u,a,f,l,c;s=n(this.el),f=this.formatters.slice(0).reverse();for(u=0,a=f.length;u<a;u++){r=f[u],t=r.split(/\s+/),i=t.shift();if((l=e.formatters[i])!=null?l.publish:void 0)s=(c=e.formatters[i]).publish.apply(c,[s].concat(o.call(t)))}return e.config.adapter.publish(this.model,this.keypath,s)},t.prototype.bind=function(){var t,n,r,i,s,o,u,a,f;(o=this.binder.bind)!=null&&o.call(this,this.el),this.options.bypass?this.sync():(e.config.adapter.subscribe(this.model,this.keypath,this.sync),e.config.preloadData&&this.sync());if((u=this.options.dependencies)!=null?u.length:void 0){a=this.options.dependencies,f=[];for(i=0,s=a.length;i<s;i++)t=a[i],/^\./.test(t)?(r=this.model,n=t.substr(1)):(t=t.split("."),r=this.view.models[t.shift()],n=t.join(".")),f.push(e.config.adapter.subscribe(r,n,this.sync));return f}},t.prototype.unbind=function(){var t,n,r,i,s,o,u,a,f;(o=this.binder.unbind)!=null&&o.call(this,this.el),this.options.bypass||e.config.adapter.unsubscribe(this.model,this.keypath,this.sync);if((u=this.options.dependencies)!=null?u.length:void 0){a=this.options.dependencies,f=[];for(i=0,s=a.length;i<s;i++)t=a[i],/^\./.test(t)?(r=this.model,n=t.substr(1)):(t=t.split("."),r=this.view.models[t.shift()],n=t.join(".")),f.push(e.config.adapter.unsubscribe(r,n,this.sync));return f}},t}(),e.View=function(){function t(e,t){this.els=e,this.models=t,this.publish=s(this.publish,this),this.sync=s(this.sync,this),this.unbind=s(this.unbind,this),this.bind=s(this.bind,this),this.select=s(this.select,this),this.build=s(this.build,this),this.bindingRegExp=s(this.bindingRegExp,this),this.els.jquery||this.els instanceof Array||(this.els=[this.els]),this.build()}return t.prototype.bindingRegExp=function(){var t;return t=e.config.prefix,t?new RegExp("^data-"+t+"-"):/^data-/},t.prototype.build=function(){var t,n,r,i,s,o,a,f,l,c,h,p=this;this.bindings=[],s=[],t=this.bindingRegExp(),i=function(n){var r,i,o,a,f,l,c,h,d,v,m,g,y,b,w,E,S,x,T,N,C,k,L,A,O,M,_,D,P;if(u.call(s,n)<0){M=n.attributes;for(N=0,L=M.length;N<L;N++){r=M[N];if(t.test(r.name)){x=r.name.replace(t,"");if(!(o=e.binders[x])){_=e.binders;for(h in _)T=_[h],h!=="*"&&h.indexOf("*")!==-1&&(E=new RegExp("^"+h.replace("*",".+")+"$"),E.test(x)&&(o=T))}o||(o=e.binders["*"]);if(o.block){D=n.getElementsByTagName("*");for(C=0,A=D.length;C<A;C++)m=D[C],s.push(m);i=[r]}}}P=i||n.attributes;for(k=0,O=P.length;k<O;k++){r=P[k];if(t.test(r.name)){g={},x=r.name.replace(t,""),w=function(){var e,t,n,i;n=r.value.split("|"),i=[];for(e=0,t=n.length;e<t;e++)b=n[e],i.push(b.trim());return i}(),f=function(){var e,t,n,r;n=w.shift().split("<"),r=[];for(e=0,t=n.length;e<t;e++)l=n[e],r.push(l.trim());return r}(),y=f.shift(),S=y.split(/\.|:/),g.formatters=w,g.bypass=y.indexOf(":")!==-1,S[0]?v=p.models[S.shift()]:(v=p.models,S.shift()),d=S.join(".");if(v){if(c=f.shift())g.dependencies=c.split(/\s+/);a=new e.Binding(n,x,v,d,g),a.view=p,p.bindings.push(a)}}}i&&(i=null)}},c=this.els;for(o=0,f=c.length;o<f;o++){n=c[o],i(n),h=n.getElementsByTagName("*");for(a=0,l=h.length;a<l;a++)r=h[a],r.attributes!=null&&i(r)}},t.prototype.select=function(e){var t,n,r,i,s;i=this.bindings,s=[];for(n=0,r=i.length;n<r;n++)t=i[n],e(t)&&s.push(t);return s},t.prototype.bind=function(){var e,t,n,r,i;r=this.bindings,i=[];for(t=0,n=r.length;t<n;t++)e=r[t],i.push(e.bind());return i},t.prototype.unbind=function(){var e,t,n,r,i;r=this.bindings,i=[];for(t=0,n=r.length;t<n;t++)e=r[t],i.push(e.unbind());return i},t.prototype.sync=function(){var e,t,n,r,i;r=this.bindings,i=[];for(t=0,n=r.length;t<n;t++)e=r[t],i.push(e.sync());return i},t.prototype.publish=function(){var e,t,n,r,i;r=this.select(function(e){return e.binder.publishes}),i=[];for(t=0,n=r.length;t<n;t++)e=r[t],i.push(e.publish());return i},t}(),t=function(e,t,n,r){var i;return i=function(e){return n.call(r,e)},window.jQuery!=null?(e=jQuery(e),e.on!=null?e.on(t,i):e.bind(t,i)):window.addEventListener!=null?e.addEventListener(t,i,!1):(t="on"+t,e.attachEvent(t,i)),i},i=function(e,t,n){return window.jQuery!=null?(e=jQuery(e),e.off!=null?e.off(t,n):e.unbind(t,n)):window.removeEventListener?e.removeEventListener(t,n,!1):(t="on"+t,e.detachEvent(t,n))},n=function(e){var t,n,r,i;switch(e.type){case"checkbox":return e.checked;case"select-multiple":i=[];for(n=0,r=e.length;n<r;n++)t=e[n],t.selected&&i.push(t.value);return i;default:return e.value}},e.binders={enabled:function(e,t){return e.disabled=!t},disabled:function(e,t){return e.disabled=!!t},checked:{publishes:!0,bind:function(e){return this.currentListener=t(e,"change",this.publish)},unbind:function(e){return i(e,"change",this.currentListener)},routine:function(e,t){return e.type==="radio"?e.checked=e.value===t:e.checked=!!t}},unchecked:{publishes:!0,bind:function(e){return this.currentListener=t(e,"change",this.publish)},unbind:function(e){return i(e,"change",this.currentListener)},routine:function(e,t){return e.type==="radio"?e.checked=e.value!==t:e.checked=!t}},show:function(e,t){return e.style.display=t?"":"none"},hide:function(e,t){return e.style.display=t?"none":""},html:function(e,t){return e.innerHTML=t!=null?t:""},value:{publishes:!0,bind:function(e){return this.currentListener=t(e,"change",this.publish)},unbind:function(e){return i(e,"change",this.currentListener)},routine:function(e,t){var n,r,i,s,o;if(e.type!=="select-multiple")return e.value=t!=null?t:"";if(t!=null){o=[];for(r=0,i=e.length;r<i;r++)n=e[r],o.push(n.selected=(s=n.value,u.call(t,s)>=0));return o}}},text:function(e,t){return e.innerText!=null?e.innerText=t!=null?t:"":e.textContent=t!=null?t:""},"on-*":{"function":!0,routine:function(e,n){return this.currentListener&&i(e,this.args[0],this.currentListener),this.currentListener=t(e,this.args[0],n,this.model)}},"each-*":{block:!0,bind:function(e,t){return e.removeAttribute(["data",r.config.prefix,this.type].join("-").replace("--","-"))},routine:function(e,t){var n,i,s,o,u,a,f,l,c,h,p,d,v,m,g,y,b,w,E;if(this.iterated!=null){g=this.iterated;for(c=0,d=g.length;c<d;c++){l=g[c],l.unbind(),y=l.els;for(h=0,v=y.length;h<v;h++)i=y[h],i.parentNode.removeChild(i)}}else this.marker=document.createComment(" rivets: "+this.type+" "),e.parentNode.insertBefore(this.marker,e),e.parentNode.removeChild(e);this.iterated=[];if(t){E=[];for(p=0,m=t.length;p<m;p++){s=t[p],n={},b=this.view.models;for(a in b)u=b[a],n[a]=u;n[this.args[0]]=s,o=e.cloneNode(!0),this.iterated.length>0?f=this.iterated[this.iterated.length-1].els[0]:f=this.marker,this.marker.parentNode.insertBefore(o,(w=f.nextSibling)!=null?w:null),E.push(this.iterated.push(r.bind(o,n)))}return E}}},"class-*":function(e,t){var n;n=" "+e.className+" ";if(!t==(n.indexOf(" "+this.args[0]+" ")!==-1))return e.className=t?""+e.className+" "+this.args[0]:n.replace(" "+this.args[0]+" "," ").trim()},"*":function(e,t){return t?e.setAttribute(this.type,t):e.removeAttribute(this.type)}},e.config={preloadData:!0},e.formatters={},r={binders:e.binders,formatters:e.formatters,config:e.config,configure:function(t){var n,r;t==null&&(t={});for(n in t)r=t[n],e.config[n]=r},bind:function(t,n){var r;return n==null&&(n={}),r=new e.View(t,n),r.bind(),r}},typeof module!="undefined"&&module!==null?module.exports=r:this.rivets=r}).call(this); | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
5 | (function(){var e,t,n,r,i,s=function(e,t){return function(){return e.apply(t,arguments)}},o=[].slice,u=[].indexOf||function(e){for(var t=0,n=this.length;t<n;t++)if(t in this&&this[t]===e)return t;return-1};e={},String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}),e.Binding=function(){function t(t,n,r,i,o){var u,a,f,l;this.el=t,this.type=n,this.model=r,this.keypath=i,this.options=o!=null?o:{},this.unbind=s(this.unbind,this),this.bind=s(this.bind,this),this.publish=s(this.publish,this),this.sync=s(this.sync,this),this.set=s(this.set,this),this.formattedValue=s(this.formattedValue,this);if(!(this.binder=e.binders[n])){l=e.binders;for(u in l)f=l[u],u!=="*"&&u.indexOf("*")!==-1&&(a=new RegExp("^"+u.replace("*",".+")+"$"),a.test(n)&&(this.binder=f,this.args=(new RegExp("^"+u.replace("*","(.+)")+"$")).exec(n),this.args.shift()))}this.binder||(this.binder=e.binders["*"]),this.binder instanceof Function&&(this.binder={routine:this.binder}),this.formatters=this.options.formatters||[]}return t.prototype.formattedValue=function(t){var n,r,i,s,u,a;a=this.formatters;for(s=0,u=a.length;s<u;s++)r=a[s],n=r.split(/\s+/),i=n.shift(),r=this.model[i]instanceof Function?this.model[i]:e.formatters[i],(r!=null?r.read:void 0)instanceof Function?t=r.read.apply(r,[t].concat(o.call(n))):r instanceof Function&&(t=r.apply(null,[t].concat(o.call(n))));return t},t.prototype.set=function(e){var t;return e=e instanceof Function&&!this.binder["function"]?this.formattedValue(e.call(this.model)):this.formattedValue(e),(t=this.binder.routine)!=null?t.call(this,this.el,e):void 0},t.prototype.sync=function(){return this.set(this.options.bypass?this.model[this.keypath]:e.config.adapter.read(this.model,this.keypath))},t.prototype.publish=function(){var t,n,i,s,u,a,f,l,c;s=r(this.el),f=this.formatters.slice(0).reverse();for(u=0,a=f.length;u<a;u++){n=f[u],t=n.split(/\s+/),i=t.shift();if((l=e.formatters[i])!=null?l.publish:void 0)s=(c=e.formatters[i]).publish.apply(c,[s].concat(o.call(t)))}return e.config.adapter.publish(this.model,this.keypath,s)},t.prototype.bind=function(){var t,n,r,i,s,o,u,a,f;(o=this.binder.bind)!=null&&o.call(this,this.el),this.options.bypass?this.sync():(e.config.adapter.subscribe(this.model,this.keypath,this.sync),e.config.preloadData&&this.sync());if((u=this.options.dependencies)!=null?u.length:void 0){a=this.options.dependencies,f=[];for(i=0,s=a.length;i<s;i++)t=a[i],/^\./.test(t)?(r=this.model,n=t.substr(1)):(t=t.split("."),r=this.view.models[t.shift()],n=t.join(".")),f.push(e.config.adapter.subscribe(r,n,this.sync));return f}},t.prototype.unbind=function(){var t,n,r,i,s,o,u,a,f;(o=this.binder.unbind)!=null&&o.call(this,this.el),this.options.bypass||e.config.adapter.unsubscribe(this.model,this.keypath,this.sync);if((u=this.options.dependencies)!=null?u.length:void 0){a=this.options.dependencies,f=[];for(i=0,s=a.length;i<s;i++)t=a[i],/^\./.test(t)?(r=this.model,n=t.substr(1)):(t=t.split("."),r=this.view.models[t.shift()],n=t.join(".")),f.push(e.config.adapter.unsubscribe(r,n,this.sync));return f}},t}(),e.View=function(){function t(e,t){this.els=e,this.models=t,this.publish=s(this.publish,this),this.sync=s(this.sync,this),this.unbind=s(this.unbind,this),this.bind=s(this.bind,this),this.select=s(this.select,this),this.build=s(this.build,this),this.bindingRegExp=s(this.bindingRegExp,this),this.els.jquery||this.els instanceof Array||(this.els=[this.els]),this.build()}return t.prototype.bindingRegExp=function(){var t;return t=e.config.prefix,t?new RegExp("^data-"+t+"-"):/^data-/},t.prototype.build=function(){var t,n,r,i,s,o,a,f,l,c,h,p=this;this.bindings=[],s=[],t=this.bindingRegExp(),i=function(n){var r,i,o,a,f,l,c,h,d,v,m,g,y,b,w,E,S,x,T,N,C,k,L,A,O,M,_,D,P;if(u.call(s,n)<0){M=n.attributes;for(N=0,L=M.length;N<L;N++){r=M[N];if(t.test(r.name)){x=r.name.replace(t,"");if(!(o=e.binders[x])){_=e.binders;for(h in _)T=_[h],h!=="*"&&h.indexOf("*")!==-1&&(E=new RegExp("^"+h.replace("*",".+")+"$"),E.test(x)&&(o=T))}o||(o=e.binders["*"]);if(o.block){D=n.getElementsByTagName("*");for(C=0,A=D.length;C<A;C++)m=D[C],s.push(m);i=[r]}}}P=i||n.attributes;for(k=0,O=P.length;k<O;k++){r=P[k];if(t.test(r.name)){g={},x=r.name.replace(t,""),w=function(){var e,t,n,i;n=r.value.split("|"),i=[];for(e=0,t=n.length;e<t;e++)b=n[e],i.push(b.trim());return i}(),f=function(){var e,t,n,r;n=w.shift().split("<"),r=[];for(e=0,t=n.length;e<t;e++)l=n[e],r.push(l.trim());return r}(),y=f.shift(),S=y.split(/\.|:/),g.formatters=w,g.bypass=y.indexOf(":")!==-1,S[0]?v=p.models[S.shift()]:(v=p.models,S.shift()),d=S.join(".");if(v){if(c=f.shift())g.dependencies=c.split(/\s+/);a=new e.Binding(n,x,v,d,g),a.view=p,p.bindings.push(a)}}}i&&(i=null)}},c=this.els;for(o=0,f=c.length;o<f;o++){n=c[o],i(n),h=n.getElementsByTagName("*");for(a=0,l=h.length;a<l;a++)r=h[a],r.attributes!=null&&i(r)}},t.prototype.select=function(e){var t,n,r,i,s;i=this.bindings,s=[];for(n=0,r=i.length;n<r;n++)t=i[n],e(t)&&s.push(t);return s},t.prototype.bind=function(){var e,t,n,r,i;r=this.bindings,i=[];for(t=0,n=r.length;t<n;t++)e=r[t],i.push(e.bind());return i},t.prototype.unbind=function(){var e,t,n,r,i;r=this.bindings,i=[];for(t=0,n=r.length;t<n;t++)e=r[t],i.push(e.unbind());return i},t.prototype.sync=function(){var e,t,n,r,i;r=this.bindings,i=[];for(t=0,n=r.length;t<n;t++)e=r[t],i.push(e.sync());return i},t.prototype.publish=function(){var e,t,n,r,i;r=this.select(function(e){return e.binder.publishes}),i=[];for(t=0,n=r.length;t<n;t++)e=r[t],i.push(e.publish());return i},t}(),t=function(e,t,n,r){var i;return i=function(e){return n.call(r,e)},window.jQuery!=null?(e=jQuery(e),e.on!=null?e.on(t,i):e.bind(t,i)):window.addEventListener!=null?e.addEventListener(t,i,!1):(t="on"+t,e.attachEvent(t,i)),i},i=function(e,t,n){return window.jQuery!=null?(e=jQuery(e),e.off!=null?e.off(t,n):e.unbind(t,n)):window.removeEventListener?e.removeEventListener(t,n,!1):(t="on"+t,e.detachEvent(t,n))},r=function(e){var t,n,r,i;if(window.jQuery!=null){e=jQuery(e);switch(e[0].type){case"checkbox":return e.is(":checked");default:return e.val()}}else switch(e.type){case"checkbox":return e.checked;case"select-multiple":i=[];for(n=0,r=e.length;n<r;n++)t=e[n],t.selected&&i.push(t.value);return i;default:return e.value}},e.binders={enabled:function(e,t){return e.disabled=!t},disabled:function(e,t){return e.disabled=!!t},checked:{publishes:!0,bind:function(e){return this.currentListener=t(e,"change",this.publish)},unbind:function(e){return i(e,"change",this.currentListener)},routine:function(e,t){var n;return e.type==="radio"?e.checked=((n=e.value)!=null?n.toString():void 0)===(t!=null?t.toString():void 0):e.checked=!!t}},unchecked:{publishes:!0,bind:function(e){return this.currentListener=t(e,"change",this.publish)},unbind:function(e){return i(e,"change",this.currentListener)},routine:function(e,t){var n;return e.type==="radio"?e.checked=((n=e.value)!=null?n.toString():void 0)!==(t!=null?t.toString():void 0):e.checked=!t}},show:function(e,t){return e.style.display=t?"":"none"},hide:function(e,t){return e.style.display=t?"none":""},html:function(e,t){return e.innerHTML=t!=null?t:""},value:{publishes:!0,bind:function(e){return this.currentListener=t(e,"change",this.publish)},unbind:function(e){return i(e,"change",this.currentListener)},routine:function(e,t){var n,r,i,s,o,a,f;if(window.jQuery!=null){e=jQuery(e);if((t!=null?t.toString():void 0)!==((s=e.val())!=null?s.toString():void 0))return e.val(t!=null?t:"")}else if(e.type==="select-multiple"){if(t!=null){f=[];for(r=0,i=e.length;r<i;r++)n=e[r],f.push(n.selected=(o=n.value,u.call(t,o)>=0));return f}}else if((t!=null?t.toString():void 0)!==((a=e.value)!=null?a.toString():void 0))return e.value=t!=null?t:""}},text:function(e,t){return e.innerText!=null?e.innerText=t!=null?t:"":e.textContent=t!=null?t:""},"on-*":{"function":!0,routine:function(e,n){return this.currentListener&&i(e,this.args[0],this.currentListener),this.currentListener=t(e,this.args[0],n,this.model)}},"each-*":{block:!0,bind:function(e,t){return e.removeAttribute(["data",rivets.config.prefix,this.type].join("-").replace("--","-"))},routine:function(e,t){var n,r,i,s,o,u,a,f,l,c,h,p,d,v,m,g,y,b,w;if(this.iterated!=null){m=this.iterated;for(l=0,p=m.length;l<p;l++){f=m[l],f.unbind(),g=f.els;for(c=0,d=g.length;c<d;c++)r=g[c],r.parentNode.removeChild(r)}}else this.marker=document.createComment(" rivets: "+this.type+" "),e.parentNode.insertBefore(this.marker,e),e.parentNode.removeChild(e);this.iterated=[];if(t){w=[];for(h=0,v=t.length;h<v;h++){i=t[h],n={},y=this.view.models;for(u in y)o=y[u],n[u]=o;n[this.args[0]]=i,s=e.cloneNode(!0),this.iterated.length>0?a=this.iterated[this.iterated.length-1].els[0]:a=this.marker,this.marker.parentNode.insertBefore(s,(b=a.nextSibling)!=null?b:null),w.push(this.iterated.push(rivets.bind(s,n)))}return w}}},"class-*":function(e,t){var n;n=" "+e.className+" ";if(!t==(n.indexOf(" "+this.args[0]+" ")!==-1))return e.className=t?""+e.className+" "+this.args[0]:n.replace(" "+this.args[0]+" "," ").trim()},"*":function(e,t){return t?e.setAttribute(this.type,t):e.removeAttribute(this.type)}},e.config={preloadData:!0},e.formatters={},n=function(t){return t.binders=e.binders,t.formatters=e.formatters,t.config=e.config,t.configure=function(t){var n,r;t==null&&(t={});for(n in t)r=t[n],e.config[n]=r},t.bind=function(t,n){var r;return n==null&&(n={}),r=new e.View(t,n),r.bind(),r}},typeof exports=="object"?n(exports):typeof define=="function"&&define.amd?define(["exports"],function(e){return n(this.rivets=e),e}):n(this.rivets={})}).call(this); | ||
... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
1 | { | 1 | { |
2 | "name" : "rivets", | 2 | "name" : "rivets", |
3 | "description" : "Declarative data binding facility.", | 3 | "description" : "Declarative data binding facility.", |
4 | "version" : "0.4.5", | 4 | "version" : "0.4.8", |
5 | "author" : "Michael Richards", | 5 | "author" : "Michael Richards", |
6 | "url" : "http://rivetsjs.com", | 6 | "url" : "http://rivetsjs.com", |
7 | "main" : "./lib/rivets.js", | 7 | "main" : "./lib/rivets.js", | ... | ... |
1 | describe('Routines', function() { | 1 | describe('Routines', function() { |
2 | var el, input; | 2 | var el, input, trueRadioInput, falseRadioInput, checkboxInput; |
3 | |||
4 | var createInputElement = function(type, value) { | ||
5 | var elem = document.createElement('input'); | ||
6 | elem.setAttribute('type', type); | ||
7 | if (value !== undefined){ | ||
8 | elem.setAttribute('value', value); | ||
9 | } | ||
10 | document.body.appendChild(elem); | ||
11 | return elem; | ||
12 | }; | ||
3 | 13 | ||
4 | beforeEach(function() { | 14 | beforeEach(function() { |
5 | rivets.configure({ | 15 | rivets.configure({ |
... | @@ -12,8 +22,27 @@ describe('Routines', function() { | ... | @@ -12,8 +22,27 @@ describe('Routines', function() { |
12 | }); | 22 | }); |
13 | 23 | ||
14 | el = document.createElement('div'); | 24 | el = document.createElement('div'); |
15 | input = document.createElement('input'); | 25 | document.body.appendChild(el); |
16 | input.setAttribute('type', 'text'); | 26 | |
27 | input = createInputElement('text'); | ||
28 | |||
29 | // to test the radio input scenario when its value is "true" | ||
30 | trueRadioInput = createInputElement('radio', 'true'); | ||
31 | |||
32 | // to test the radio input scenario when its value is "false" | ||
33 | falseRadioInput = createInputElement('radio', 'false'); | ||
34 | |||
35 | // to test the checkbox input scenario | ||
36 | checkboxInput = createInputElement('checkbox'); | ||
37 | |||
38 | }); | ||
39 | |||
40 | afterEach(function(){ | ||
41 | el.parentNode.removeChild(el); | ||
42 | input.parentNode.removeChild(input); | ||
43 | trueRadioInput.parentNode.removeChild(trueRadioInput); | ||
44 | falseRadioInput.parentNode.removeChild(falseRadioInput); | ||
45 | checkboxInput.parentNode.removeChild(checkboxInput); | ||
17 | }); | 46 | }); |
18 | 47 | ||
19 | describe('text', function() { | 48 | describe('text', function() { |
... | @@ -126,33 +155,101 @@ describe('Routines', function() { | ... | @@ -126,33 +155,101 @@ describe('Routines', function() { |
126 | }); | 155 | }); |
127 | 156 | ||
128 | describe('checked', function() { | 157 | describe('checked', function() { |
129 | describe('with a truthy value', function() { | 158 | describe('with a checkbox input', function() { |
130 | it('checks the element', function() { | 159 | describe('and a truthy value', function() { |
131 | rivets.binders.checked.routine(el, true); | 160 | it('checks the checkbox input', function() { |
132 | expect(el.checked).toBe(true); | 161 | rivets.binders.checked.routine(checkboxInput, true); |
162 | expect(checkboxInput.checked).toBe(true); | ||
163 | }); | ||
164 | }); | ||
165 | |||
166 | describe('with a falsey value', function() { | ||
167 | it('unchecks the checkbox input', function() { | ||
168 | rivets.binders.checked.routine(checkboxInput, false); | ||
169 | expect(checkboxInput.checked).toBe(false); | ||
170 | }); | ||
133 | }); | 171 | }); |
134 | }); | 172 | }); |
135 | 173 | ||
136 | describe('with a falsey value', function() { | 174 | describe('with a radio input with value="true"', function() { |
137 | it('unchecks the element', function() { | 175 | describe('and a truthy value', function() { |
138 | rivets.binders.checked.routine(el, false); | 176 | it('checks the radio input', function() { |
139 | expect(el.checked).toBe(false); | 177 | rivets.binders.checked.routine(trueRadioInput, true); |
178 | expect(trueRadioInput.checked).toBe(true); | ||
179 | }); | ||
180 | }); | ||
181 | |||
182 | describe('with a falsey value', function() { | ||
183 | it('unchecks the radio input', function() { | ||
184 | rivets.binders.checked.routine(trueRadioInput, false); | ||
185 | expect(trueRadioInput.checked).toBe(false); | ||
186 | }); | ||
187 | }); | ||
188 | }); | ||
189 | |||
190 | describe('with a radio input with value="false"', function() { | ||
191 | describe('and a truthy value', function() { | ||
192 | it('checks the radio input', function() { | ||
193 | rivets.binders.checked.routine(falseRadioInput, true); | ||
194 | expect(falseRadioInput.checked).toBe(false); | ||
195 | }); | ||
196 | }); | ||
197 | |||
198 | describe('with a falsey value', function() { | ||
199 | it('unchecks the radio input', function() { | ||
200 | rivets.binders.checked.routine(falseRadioInput, false); | ||
201 | expect(falseRadioInput.checked).toBe(true); | ||
202 | }); | ||
140 | }); | 203 | }); |
141 | }); | 204 | }); |
142 | }); | 205 | }); |
143 | 206 | ||
144 | describe('unchecked', function() { | 207 | describe('unchecked', function() { |
145 | describe('with a truthy value', function() { | 208 | describe('and a truthy value', function() { |
146 | it('unchecks the element', function() { | 209 | describe('and a truthy value', function() { |
147 | rivets.binders.unchecked.routine(el, true); | 210 | it('checks the checkbox input', function() { |
148 | expect(el.checked).toBe(false); | 211 | rivets.binders.unchecked.routine(checkboxInput, true); |
212 | expect(checkboxInput.checked).toBe(false); | ||
213 | }); | ||
214 | }); | ||
215 | |||
216 | describe('with a falsey value', function() { | ||
217 | it('unchecks the checkbox input', function() { | ||
218 | rivets.binders.unchecked.routine(checkboxInput, false); | ||
219 | expect(checkboxInput.checked).toBe(true); | ||
220 | }); | ||
149 | }); | 221 | }); |
150 | }); | 222 | }); |
151 | 223 | ||
152 | describe('with a falsey value', function() { | 224 | describe('with a radio input with value="true"', function() { |
153 | it('checks the element', function() { | 225 | describe('and a truthy value', function() { |
154 | rivets.binders.unchecked.routine(el, false); | 226 | it('checks the radio input', function() { |
155 | expect(el.checked).toBe(true); | 227 | rivets.binders.unchecked.routine(trueRadioInput, true); |
228 | expect(trueRadioInput.checked).toBe(false); | ||
229 | }); | ||
230 | }); | ||
231 | |||
232 | describe('with a falsey value', function() { | ||
233 | it('unchecks the radio input', function() { | ||
234 | rivets.binders.unchecked.routine(trueRadioInput, false); | ||
235 | expect(trueRadioInput.checked).toBe(true); | ||
236 | }); | ||
237 | }); | ||
238 | }); | ||
239 | |||
240 | describe('with a radio input with value="false"', function() { | ||
241 | describe('and a truthy value', function() { | ||
242 | it('checks the radio input', function() { | ||
243 | rivets.binders.unchecked.routine(falseRadioInput, true); | ||
244 | expect(falseRadioInput.checked).toBe(true); | ||
245 | }); | ||
246 | }); | ||
247 | |||
248 | describe('with a falsey value', function() { | ||
249 | it('unchecks the radio input', function() { | ||
250 | rivets.binders.unchecked.routine(falseRadioInput, false); | ||
251 | expect(falseRadioInput.checked).toBe(false); | ||
252 | }); | ||
156 | }); | 253 | }); |
157 | }); | 254 | }); |
158 | }); | 255 | }); | ... | ... |
1 | # rivets.js | 1 | # rivets.js |
2 | # version : 0.4.5 | 2 | # version : 0.4.8 |
3 | # author : Michael Richards | 3 | # author : Michael Richards |
4 | # license : MIT | 4 | # license : MIT |
5 | 5 | ||
... | @@ -256,12 +256,19 @@ unbindEvent = (el, event, fn) -> | ... | @@ -256,12 +256,19 @@ unbindEvent = (el, event, fn) -> |
256 | event = 'on' + event | 256 | event = 'on' + event |
257 | el.detachEvent event, fn | 257 | el.detachEvent event, fn |
258 | 258 | ||
259 | # Returns the current input value for the specified element. | 259 | # Cross-browser input value getter. |
260 | getInputValue = (el) -> | 260 | getInputValue = (el) -> |
261 | switch el.type | 261 | if window.jQuery? |
262 | when 'checkbox' then el.checked | 262 | el = jQuery el |
263 | when 'select-multiple' then o.value for o in el when o.selected | 263 | |
264 | else el.value | 264 | switch el[0].type |
265 | when 'checkbox' then el.is ':checked' | ||
266 | else el.val() | ||
267 | else | ||
268 | switch el.type | ||
269 | when 'checkbox' then el.checked | ||
270 | when 'select-multiple' then o.value for o in el when o.selected | ||
271 | else el.value | ||
265 | 272 | ||
266 | # Core binding routines. | 273 | # Core binding routines. |
267 | Rivets.binders = | 274 | Rivets.binders = |
... | @@ -279,7 +286,7 @@ Rivets.binders = | ... | @@ -279,7 +286,7 @@ Rivets.binders = |
279 | unbindEvent el, 'change', @currentListener | 286 | unbindEvent el, 'change', @currentListener |
280 | routine: (el, value) -> | 287 | routine: (el, value) -> |
281 | if el.type is 'radio' | 288 | if el.type is 'radio' |
282 | el.checked = el.value is value | 289 | el.checked = el.value?.toString() is value?.toString() |
283 | else | 290 | else |
284 | el.checked = !!value | 291 | el.checked = !!value |
285 | 292 | ||
... | @@ -291,7 +298,7 @@ Rivets.binders = | ... | @@ -291,7 +298,7 @@ Rivets.binders = |
291 | unbindEvent el, 'change', @currentListener | 298 | unbindEvent el, 'change', @currentListener |
292 | routine: (el, value) -> | 299 | routine: (el, value) -> |
293 | if el.type is 'radio' | 300 | if el.type is 'radio' |
294 | el.checked = el.value isnt value | 301 | el.checked = el.value?.toString() isnt value?.toString() |
295 | else | 302 | else |
296 | el.checked = !value | 303 | el.checked = !value |
297 | 304 | ||
... | @@ -311,10 +318,16 @@ Rivets.binders = | ... | @@ -311,10 +318,16 @@ Rivets.binders = |
311 | unbind: (el) -> | 318 | unbind: (el) -> |
312 | unbindEvent el, 'change', @currentListener | 319 | unbindEvent el, 'change', @currentListener |
313 | routine: (el, value) -> | 320 | routine: (el, value) -> |
314 | if el.type is 'select-multiple' | 321 | if window.jQuery? |
315 | o.selected = o.value in value for o in el if value? | 322 | el = jQuery el |
323 | |||
324 | if value?.toString() isnt el.val()?.toString() | ||
325 | el.val if value? then value else '' | ||
316 | else | 326 | else |
317 | el.value = if value? then value else '' | 327 | if el.type is 'select-multiple' |
328 | o.selected = o.value in value for o in el if value? | ||
329 | else if value?.toString() isnt el.value?.toString() | ||
330 | el.value = if value? then value else '' | ||
318 | 331 | ||
319 | text: (el, value) -> | 332 | text: (el, value) -> |
320 | if el.innerText? | 333 | if el.innerText? |
... | @@ -331,7 +344,7 @@ Rivets.binders = | ... | @@ -331,7 +344,7 @@ Rivets.binders = |
331 | "each-*": | 344 | "each-*": |
332 | block: true | 345 | block: true |
333 | bind: (el, collection) -> | 346 | bind: (el, collection) -> |
334 | el.removeAttribute ['data', rivets.config.prefix, @type].join('-').replace '--', '-' | 347 | el.removeAttribute ['data', Rivets.config.prefix, @type].join('-').replace '--', '-' |
335 | routine: (el, collection) -> | 348 | routine: (el, collection) -> |
336 | if @iterated? | 349 | if @iterated? |
337 | for view in @iterated | 350 | for view in @iterated |
... | @@ -350,12 +363,16 @@ Rivets.binders = | ... | @@ -350,12 +363,16 @@ Rivets.binders = |
350 | data[n] = m for n, m of @view.models | 363 | data[n] = m for n, m of @view.models |
351 | data[@args[0]] = item | 364 | data[@args[0]] = item |
352 | itemEl = el.cloneNode true | 365 | itemEl = el.cloneNode true |
353 | if @iterated.length > 0 | 366 | |
354 | previous = @iterated[@iterated.length - 1].els[0] | 367 | previous = if @iterated.length |
368 | @iterated[@iterated.length - 1].els[0] | ||
355 | else | 369 | else |
356 | previous = @marker | 370 | @marker |
371 | |||
357 | @marker.parentNode.insertBefore itemEl, previous.nextSibling ? null | 372 | @marker.parentNode.insertBefore itemEl, previous.nextSibling ? null |
358 | @iterated.push rivets.bind itemEl, data | 373 | view = new Rivets.View(itemEl, data) |
374 | view.bind() | ||
375 | @iterated.push view | ||
359 | 376 | ||
360 | "class-*": (el, value) -> | 377 | "class-*": (el, value) -> |
361 | elClass = " #{el.className} " | 378 | elClass = " #{el.className} " |
... | @@ -380,32 +397,36 @@ Rivets.config = | ... | @@ -380,32 +397,36 @@ Rivets.config = |
380 | Rivets.formatters = {} | 397 | Rivets.formatters = {} |
381 | 398 | ||
382 | # The rivets module. This is the public interface that gets exported. | 399 | # The rivets module. This is the public interface that gets exported. |
383 | rivets = | 400 | factory = (exports) -> |
384 | # Exposes the core binding routines that can be extended or stripped down. | 401 | # Exposes the core binding routines that can be extended or stripped down. |
385 | binders: Rivets.binders | 402 | exports.binders = Rivets.binders |
386 | 403 | ||
387 | # Exposes the formatters object to be extended. | 404 | # Exposes the formatters object to be extended. |
388 | formatters: Rivets.formatters | 405 | exports.formatters = Rivets.formatters |
389 | 406 | ||
390 | # Exposes the rivets configuration options. These can be set manually or from | 407 | # Exposes the rivets configuration options. These can be set manually or from |
391 | # rivets.configure with an object literal. | 408 | # rivets.configure with an object literal. |
392 | config: Rivets.config | 409 | exports.config = Rivets.config |
393 | 410 | ||
394 | # Sets configuration options by merging an object literal. | 411 | # Sets configuration options by merging an object literal. |
395 | configure: (options={}) -> | 412 | exports.configure = (options={}) -> |
396 | for property, value of options | 413 | for property, value of options |
397 | Rivets.config[property] = value | 414 | Rivets.config[property] = value |
398 | return | 415 | return |
399 | 416 | ||
400 | # Binds a set of model objects to a parent DOM element. Returns a Rivets.View | 417 | # Binds a set of model objects to a parent DOM element. Returns a Rivets.View |
401 | # instance. | 418 | # instance. |
402 | bind: (el, models = {}, options) -> | 419 | exports.bind = (el, models = {}, options = {}) -> |
403 | view = new Rivets.View(el, models, options) | 420 | view = new Rivets.View(el, models, options) |
404 | view.bind() | 421 | view.bind() |
405 | view | 422 | view |
406 | 423 | ||
407 | # Exports rivets for both CommonJS and the browser. | 424 | # Exports rivets for CommonJS, AMD and the browser. |
408 | if module? | 425 | if typeof exports == 'object' |
409 | module.exports = rivets | 426 | factory(exports) |
427 | else if typeof define == 'function' && define.amd | ||
428 | define ['exports'], (exports) -> | ||
429 | factory(@rivets = exports) | ||
430 | return exports | ||
410 | else | 431 | else |
411 | @rivets = rivets | 432 | factory(@rivets = {}) | ... | ... |
-
Please register or sign in to post a comment