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