assets/js/vendor/backbone-relational.js
function( eventName ) {
			if ( eventName.length > 5 && eventName.indexOf( 'change' ) === 0 ) {
				var dit = this,
					args = arguments;

				Backbone.Relational.eventQueue.add( function() {
					if ( !dit._isInitialized ) {
						return;
					}

					// Determine if the `change` event is still valid, now that all relations are populated
					var changed = true;
					if ( eventName === 'change' ) {
						// `hasChanged` may have gotten reset by nested calls to `set`.
						changed = dit.hasChanged() || dit._attributeChangeFired;
						dit._attributeChangeFired = false;
					}
					else {
						var attr = eventName.slice( 7 ),
							rel = dit.getRelation( attr );

						if ( rel ) {
							// If `attr` is a relation, `change:attr` get triggered from `Relation.onChange`.
							// These take precedence over `change:attr` events triggered by `Model.set`.
							// The relation sets a fourth attribute to `true`. If this attribute is present,
							// continue triggering this event; otherwise, it's from `Model.set` and should be stopped.
							changed = ( args[ 4 ] === true );

							// If this event was triggered by a relation, set the right value in `this.changed`
							// (a Collection or Model instead of raw data).
							if ( changed ) {
								dit.changed[ attr ] = args[ 2 ];
							}
							// Otherwise, this event is from `Model.set`. If the relation doesn't report a change,
							// remove attr from `dit.changed` so `hasChanged` doesn't take it into account.
							else if ( !rel.changed ) {
								delete dit.changed[ attr ];
							}
						}
						else if ( changed ) {
							dit._attributeChangeFired = true;
						}
					}

					changed && Backbone.Model.prototype.trigger.apply( dit, args );
				});
			}
			else {
				Backbone.Model.prototype.trigger.apply( this, arguments );
			}

			return this;
		}
function( eventName ) {
			if ( eventName.length > 5 && eventName.indexOf( 'change' ) === 0 ) {
				var dit = this,
					args = arguments;

				Backbone.Relational.eventQueue.add( function() {
					if ( !dit._isInitialized ) {
						return;
					}

					// Determine if the `change` event is still valid, now that all relations are populated
					var changed = true;
					if ( eventName === 'change' ) {
						// `hasChanged` may have gotten reset by nested calls to `set`.
						changed = dit.hasChanged() || dit._attributeChangeFired;
						dit._attributeChangeFired = false;
					}
					else {
						var attr = eventName.slice( 7 ),
							rel = dit.getRelation( attr );

						if ( rel ) {
							// If `attr` is a relation, `change:attr` get triggered from `Relation.onChange`.
							// These take precedence over `change:attr` events triggered by `Model.set`.
							// The relation sets a fourth attribute to `true`. If this attribute is present,
							// continue triggering this event; otherwise, it's from `Model.set` and should be stopped.
							changed = ( args[ 4 ] === true );

							// If this event was triggered by a relation, set the right value in `this.changed`
							// (a Collection or Model instead of raw data).
							if ( changed ) {
								dit.changed[ attr ] = args[ 2 ];
							}
							// Otherwise, this event is from `Model.set`. If the relation doesn't report a change,
							// remove attr from `dit.changed` so `hasChanged` doesn't take it into account.
							else if ( !rel.changed ) {
								delete dit.changed[ attr ];
							}
						}
						else if ( changed ) {
							dit._attributeChangeFired = true;
						}
					}

					changed && Backbone.Model.prototype.trigger.apply( dit, args );
				});
			}
			else {
				Backbone.Model.prototype.trigger.apply( this, arguments );
			}

			return this;
		}
function ( eventName ) { if ( eventName . length > 5 && eventName . indexOf ( 'change' ) === 0 ) { var dit = this , args = arguments ; Backbone . Relational . eventQueue . add ( function ( ) { if ( ! dit . _isInitialized ) { return ; } // Determine if the `change` event is still valid, now that all relations are populated var changed = true ; if ( eventName === 'change' ) { // `hasChanged` may have gotten reset by nested calls to `set`. changed = dit . hasChanged ( ) || dit . _attributeChangeFired ; dit . _attributeChangeFired = false ; } else { var attr = eventName . slice ( 7 ) , rel = dit . getRelation ( attr ) ; if ( rel ) { // If `attr` is a relation, `change:attr` get triggered from `Relation.onChange`. // These take precedence over `change:attr` events triggered by `Model.set`. // The relation sets a fourth attribute to `true`. If this attribute is present, // continue triggering this event; otherwise, it's from `Model.set` and should be stopped. changed = ( args [ 4 ] === true ) ; // If this event was triggered by a relation, set the right value in `this.changed` // (a Collection or Model instead of raw data). if ( changed ) { dit . changed [ attr ] = args [ 2 ] ; } // Otherwise, this event is from `Model.set`. If the relation doesn't report a change, // remove attr from `dit.changed` so `hasChanged` doesn't take it into account. else if ( ! rel . changed ) { delete dit . changed [ attr ] ; } } else if ( changed ) { dit . _attributeChangeFired = true ; } } changed && Backbone . Model . prototype . trigger . apply ( dit , args ) ; } ) ; } else { Backbone . Model . prototype . trigger . apply ( this , arguments ) ; } return this ; }
Override 'trigger' to queue 'change' and 'change:*' events
Override trigger to queue change and change : * events