-
Notifications
You must be signed in to change notification settings - Fork 42
/
js-model-0.7.3.min.js
16 lines (16 loc) · 4.76 KB
/
js-model-0.7.3.min.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/* js-model JavaScript library, version 0.7.3
* (c) 2010 Ben Pickles
*
* Released under MIT license.
*/
var Model=function(e,f){var g=function(a){this._name=e;this.attributes=a||{};this.callbacks={};this.changes={};this.collection=b;this.errors=new Model.Errors(this)},b;if(f&&f.collection){b=f.collection;delete f.collection}else b=Model.Collection();g=$.extend(g,b);g.prototype=$.extend({attr:function(a,c){if(arguments.length==0)return $.extend(_.clone(this.attributes),this.changes);else if(arguments.length==2){if(_.isEqual(this.attributes[a],c))delete this.changes[a];else this.changes[a]=c;return this}else if(typeof a==
"object"){for(var d in a)this.attr(d,a[d]);return this}else return a in this.changes?this.changes[a]:this.attributes[a]},bind:function(a,c){this.callbacks[a]=this.callbacks[a]||[];this.callbacks[a].push(c);return this},callPersistMethod:function(a,c){var d=this,h=function(){if(d.collection)if(a=="create")d.collection.add(d);else a=="destroy"&&d.collection.remove(d.id())},i=function(j){if(j){d.merge(d.changes).reset();h();d.trigger(a)}var k;if(c)k=c.apply(d,arguments);return k};this.persistence?this.persistence[a](this,
i):i.call(this,true)},destroy:function(a){this.callPersistMethod("destroy",a);return this},id:function(){return this.attributes.id||null},merge:function(a){$.extend(this.attributes,a);return this},newRecord:function(){return this.id()==null},reset:function(){this.errors.clear();this.changes={};return this},save:function(a){if(this.valid())this.callPersistMethod(this.newRecord()?"create":"update",a);else a&&a(false);return this},trigger:function(a,c){if(a=this.callbacks[a])for(var d=0;d<a.length;d++)a[d].apply(this,
c||[]);return this},update:function(a){this.merge(a).trigger("update");return this},valid:function(){this.errors.clear();this.validate();return this.errors.size()==0},validate:function(){return this}},f);return g};Model.Errors=function(e){this.errors={};this.model=e};
Model.Errors.prototype={add:function(e,f){this.errors[e]||(this.errors[e]=[]);this.errors[e].push(f)},all:function(){return this.errors},clear:function(){this.errors={}},each:function(e){for(var f in this.errors)for(var g=0;g<this.errors[f].length;g++)e.call(this,f,this.errors[f][g])},on:function(e){return this.errors[e]||[]},size:function(){var e=0;this.each(function(){e++});return e}};Model.Log=function(){window.console&&window.console.log.apply(window.console,arguments)};
Model.Collection=function(e){var f=function(b){this.collection=b||[];this.callbacks={}},g=function(b){return new f(b)};f.prototype=$.extend({add:function(){for(var b=[],a=0;a<arguments.length;a++){var c=arguments[a];if(!this.detect(function(){return this.id()!=null&&this.id()==c.id()})){this.collection.push(c);b.push(c)}}b.length>0&&this.trigger("add",b);return this},all:function(){return this.collection},bind:function(b,a){this.callbacks[b]=this.callbacks[b]||[];this.callbacks[b].push(a);return this},
count:function(){return this.collection.length},detect:function(b){return _.detect(this.all(),function(a,c){return b.call(a,c)})||null},each:function(b){$.each(this.all(),function(a){b.call(this,a)});return this},find:function(b){return this.detect(function(){return this.id()==b})},first:function(){return this.all()[0]||null},last:function(){var b=this.all();return b[b.length-1]||null},remove:function(b){var a=_.invoke(this.collection,"id");b=_.indexOf(a,b);if(b>-1){this.collection.splice(b,1);this.trigger("remove");
return true}else return false},select:function(b){var a=_.select(this.all(),function(c,d){return b.call(c,d)});return g(a)},sort:function(b){var a=_.sortBy(this.all(),function(c,d){return b.call(c,d)});return g(a)},trigger:function(b,a){if(b=this.callbacks[b])for(var c=0;c<b.length;c++)b[c].apply(this,a||[]);return this}},e);return new f};
Model.RestPersistence=function(e,f){var g=function(){this.resource=e};g.prototype=$.extend({create:function(b,a){return this.xhr("POST",this.create_path(b),b,a)},create_path:function(){return this.resource},destroy:function(b,a){return this.xhr("DELETE",this.destroy_path(b),b,a)},destroy_path:function(b){return this.update_path(b)},params:function(b){var a;if(b){var c=b.attr();delete c.id;a={};a[b._name]=c}else a=null;return a},parseResponseData:function(b){try{return jQuery.parseJSON(b.responseText)}catch(a){Model.Log(a)}},
update:function(b,a){return this.xhr("PUT",this.update_path(b),b,a)},update_path:function(b){return[this.resource,b.id()].join("/")},xhr:function(b,a,c,d){var h=this,i=b=="DELETE"?null:this.params(c);return $.ajax({type:b,url:a,dataType:"text",data:i,complete:function(j,k){h.xhrComplete(j,k,c,d)}})},xhrComplete:function(b,a,c,d){var h=this.parseResponseData(b);a=a=="success";if(h)if(a)c.attr(h);else if(b.status==422){c.errors.clear();for(var i in h)for(var j=0;j<h[i].length;j++)c.errors.add(i,h[i][j])}d&&
d.call(c,a,b)}},f);return new g};