@ -1,11 +1,36 @@
( function ( root , define , require , exports , module , factory , undef ) {
/ * ! B a c k b o n e . M u t a t o r s - v 0 . 4 . 0
-- -- -- -- -- -- -- -- -- -- -- -- -- -- --
Build @ 2013 - 05 - 01
Documentation and Full License Available at :
http : //asciidisco.github.com/Backbone.Mutators/index.html
git : //github.com/asciidisco/Backbone.Mutators.git
Copyright ( c ) 2013 Sebastian Golasch < public @ asciidisco . com >
Permission is hereby granted , free of charge , to any person obtaining a
copy of this software and associated documentation files ( the "Software" ) ,
to deal in the Software without restriction , including without limitation
the rights to use , copy , modify , merge , publish , distribute , sublicense ,
and / or sell copies of the Software , and to permit persons to whom the
Software is furnished to do so , subject to the following conditions :
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software .
THE SOFTWARE IS PROVIDED "AS IS" , WITHOUT WARRANTY OF ANY KIND ,
EXPRESS OR IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT .
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM ,
DAMAGES OR OTHER LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE ,
ARISING FROM , OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE . * /
( function ( root , factory , undef ) {
'use strict' ;
if ( typeof exports === 'object' ) {
// Node. Does not work with strict CommonJS, but
// only CommonJS-like enviroments that support module.exports,
// like Node.
module . exports = factory ( require ( 'underscore' ) , require ( 'backbone' ) ) ;
module . exports = factory ( require ( 'underscore' ) , require ( ' B ackbone') ) ;
} else if ( typeof define === 'function' && define . amd ) {
// AMD. Register as an anonymous module.
define ( [ 'underscore' , 'backbone' ] , function ( _ , Backbone ) {
@ -19,45 +44,45 @@
root . returnExportsGlobal = factory ( root . _ , root . Backbone ) ;
}
// Usage:
//
// Note: This plugin is UMD compatible, you can use it in node, amd and vanilla js envs
//
// Vanilla JS:
// <script src="underscore.js"></script>
// <script src="backbone.js"></script>
// <script src="backbone.mutators.js"></script>
//
// Node:
// var _ = require('underscore');
// var Backbone = require('backbone');
// var Mutators = require('backbone.mutators');
//
//
// AMD:
// define(['underscore', 'backbone', 'backbone.mutators'], function (_, Backbone, Mutators) {
// // insert sample from below
// return User;
// });
//
// var User = Backbone.Model.extend({
// mutators: {
// fullname: function () {
// return this.firstname + ' ' + this.lastname;
// }
// },
//
// defaults: {
// firstname: 'Sebastian',
// lastname: 'Golasch'
// }
// });
//
// var user = new User();
// user.get('fullname') // returns 'Sebastian Golasch'
// user.toJSON() // return '{firstname: 'Sebastian', lastname: 'Golasch', fullname: 'Sebastian Golasch'}'
} ( this , this . define , this . require , this . exports , this . module , function ( _ , Backbone , root , undef ) {
// Usage:
//
// Note: This plugin is UMD compatible, you can use it in node, amd and vanilla js envs
//
// Vanilla JS:
// <script src="underscore.js"></script>
// <script src="backbone.js"></script>
// <script src="backbone.mutators.js"></script>
//
// Node:
// var _ = require('underscore');
// var Backbone = require('backbone');
// var Mutators = require('backbone.mutators');
//
//
// AMD:
// define(['underscore', 'backbone', 'backbone.mutators'], function (_, Backbone, Mutators) {
// // insert sample from below
// return User;
// });
//
// var User = Backbone.Model.extend({
// mutators: {
// fullname: function () {
// return this.firstname + ' ' + this.lastname;
// }
// },
//
// defaults: {
// firstname: 'Sebastian',
// lastname: 'Golasch'
// }
// });
//
// var user = new User();
// user.get('fullname') // returns 'Sebastian Golasch'
// user.toJSON() // return '{firstname: 'Sebastian', lastname: 'Golasch', fullname: 'Sebastian Golasch'}'
} ( this , function ( _ , Backbone , root , undef ) {
'use strict' ;
// check if we use the amd branch of backbone and underscore
@ -65,10 +90,10 @@
_ = _ === undef ? root . _ : _ ;
// extend backbones model prototype with the mutator functionality
var Mutator = function ( ) { } ,
oldGet = Backbone . Model . prototype . get ,
oldSet = Backbone . Model . prototype . set ,
oldToJson = Backbone . Model . prototype . toJSON ;
var Mutator = function ( ) { } ,
oldGet = Backbone . Model . prototype . get ,
oldSet = Backbone . Model . prototype . set ,
oldToJson = Backbone . Model . prototype . toJSON ;
// This is necessary to ensure that Models declared without the mutators object do not throw and error
Mutator . prototype . mutators = { } ;
@ -94,12 +119,11 @@
Mutator . prototype . set = function ( key , value , options ) {
var isMutator = this . mutators !== undef ,
ret = null ,
attrs = null ,
attr = null ;
attrs = null ;
// seamleassly stolen from backbone core
// check if the setter action is triggered
// using key <-> value or object
// check if the setter action is triggered
// using key <-> value or object
if ( _ . isObject ( key ) || key === null ) {
attrs = key ;
options = value ;
@ -114,29 +138,36 @@
// check if we need to set a single value
if ( _ . isFunction ( this . mutators [ key ] . set ) === true ) {
ret = this . mutators [ key ] . set . call ( this , key , attrs [ key ] , options , _ . bind ( oldSet , this ) ) ;
} else if ( _ . isFunction ( this . mutators [ key ] ) ) {
} else if ( _ . isFunction ( this . mutators [ key ] ) ) {
ret = this . mutators [ key ] . call ( this , key , attrs [ key ] , options , _ . bind ( oldSet , this ) ) ;
}
}
if ( _ . isObject ( attrs ) ) {
_ . each ( attrs , _ . bind ( function ( attr , attrKey ) {
var cur _ret = null ;
if ( isMutator === true && _ . isObject ( this . mutators [ attrKey ] ) === true ) {
// check if we need to set a single value
var meth = this . mutators [ attrKey ] ;
if ( _ . isFunction ( meth . set ) ) {
if ( _ . isFunction ( meth . set ) ) {
meth = meth . set ;
}
if ( _ . isFunction ( meth ) ) {
if ( _ . isFunction ( meth ) ) {
if ( options === undef || ( _ . isObject ( options ) === true && options . silent !== true && ( options . mutators !== undef && options . mutators . silent !== true ) ) ) {
this . trigger ( 'mutators:set:' + attrKey ) ;
}
ret = meth . call ( this , attrKey , attr , options , _ . bind ( oldSet , this ) ) ;
cur_ ret = meth . call ( this , attrKey , attr , options , _ . bind ( oldSet , this ) ) ;
}
}
if ( cur _ret === null ) {
cur _ret = _ . bind ( oldSet , this ) ( attrKey , attr , options ) ;
}
if ( ret !== false ) { ret = cur _ret ; }
} , this ) ) ;
}
@ -154,7 +185,7 @@
var attr = oldToJson . call ( this ) ;
// iterate over all mutators (if there are some)
_ . each ( this . mutators , _ . bind ( function ( mutator , name ) {
// check if we have some getter mutations (nested or )
// check if we have some getter mutations
if ( _ . isObject ( this . mutators [ name ] ) === true && _ . isFunction ( this . mutators [ name ] . get ) ) {
attr [ name ] = _ . bind ( this . mutators [ name ] . get , this ) ( ) ;
} else {
@ -165,10 +196,16 @@
return attr ;
} ;
// override get functionality to get HTML-escaped the mutator props
Mutator . prototype . escape = function ( attr ) {
var val = this . get ( attr ) ;
return _ . escape ( val == null ? '' : '' + val ) ;
} ;
// extend the models prototype
_ . extend ( Backbone . Model . prototype , Mutator . prototype ) ;
// make mutators globally available under the Backbone namespace
Backbone . Mutators = Mutator ;
return Mutator ;
} ) ) ;
} ) ) ;