backbone-relational-rails 0.8.5 → 0.8.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +2 -2
- data/lib/backbone-relational-rails/version.rb +1 -1
- data/vendor/assets/javascripts/backbone-relational.js +148 -77
- metadata +10 -20
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a358ff7e2c4cabae8dbddc3fbe53df8a87ff168c
|
4
|
+
data.tar.gz: 1c0de4ed22b1e62f19050ddb1811ae417e026adf
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 14f7c8b8e3385e59d57cc4de3c5a114559bfaa6af8d79de6e5e3004a4cd78a645e55d1539a582818cf0c570d91e4024090aa9ccaaef9f248641cf8f8a37cf46e
|
7
|
+
data.tar.gz: f18037d420056d0e8be90af1b8a5dbcdeea84fe49905ed24f8174caa85665938ba0986cae98cc46a410c5477a2b7836ca4ce702de06a9a313d1efe53749424eb
|
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# backbone-relational-rails
|
2
2
|
|
3
3
|
backbone-relational-rails wraps the [Backbone-relational](https://github.com/PaulUithol/Backbone-relational) library in a rails engine for simple
|
4
|
-
use with the asset pipeline provided by rails 3.1. The gem includes the development (non-minified)
|
4
|
+
use with the asset pipeline first provided by rails 3.1. The gem includes the development (non-minified)
|
5
5
|
source for ease of exploration. The asset pipeline will minify in production.
|
6
6
|
|
7
7
|
Backbone-relational provides one-to-one, one-to-many and many-to-one relations between models for [Backbone](http://backbonejs.org/).
|
@@ -18,7 +18,7 @@ Add the following directive to your Javascript manifest file (application.js):
|
|
18
18
|
|
19
19
|
## Versioning
|
20
20
|
|
21
|
-
backbone-relational-rails 0.8.
|
21
|
+
backbone-relational-rails 0.8.6 == Backbone-relational 0.8.6
|
22
22
|
|
23
23
|
Every attempt is made to mirror the currently shipping Backbone-relational version number wherever possible.
|
24
24
|
The major, minor, and patch version numbers will always represent the Backbone-relational version. Should a gem
|
@@ -1,6 +1,6 @@
|
|
1
1
|
/* vim: set tabstop=4 softtabstop=4 shiftwidth=4 noexpandtab: */
|
2
2
|
/**
|
3
|
-
* Backbone-relational.js 0.8.
|
3
|
+
* Backbone-relational.js 0.8.6
|
4
4
|
* (c) 2011-2013 Paul Uithol and contributors (https://github.com/PaulUithol/Backbone-relational/graphs/contributors)
|
5
5
|
*
|
6
6
|
* Backbone-relational may be freely distributed under the MIT license; see the accompanying LICENSE.txt.
|
@@ -17,7 +17,8 @@
|
|
17
17
|
if ( typeof window === 'undefined' ) {
|
18
18
|
_ = require( 'underscore' );
|
19
19
|
Backbone = require( 'backbone' );
|
20
|
-
exports =
|
20
|
+
exports = Backbone;
|
21
|
+
typeof module === 'undefined' || ( module.exports = exports );
|
21
22
|
}
|
22
23
|
else {
|
23
24
|
_ = window._;
|
@@ -86,9 +87,21 @@
|
|
86
87
|
}
|
87
88
|
},
|
88
89
|
|
90
|
+
// Some of the queued events may trigger other blocking events. By
|
91
|
+
// copying the queue here it allows queued events to process closer to
|
92
|
+
// the natural order.
|
93
|
+
//
|
94
|
+
// queue events [ 'A', 'B', 'C' ]
|
95
|
+
// A handler of 'B' triggers 'D' and 'E'
|
96
|
+
// By copying `this._queue` this executes:
|
97
|
+
// [ 'A', 'B', 'D', 'E', 'C' ]
|
98
|
+
// The same order the would have executed if they didn't have to be
|
99
|
+
// delayed and queued.
|
89
100
|
process: function() {
|
90
|
-
|
91
|
-
|
101
|
+
var queue = this._queue;
|
102
|
+
this._queue = [];
|
103
|
+
while ( queue && queue.length ) {
|
104
|
+
queue.shift()();
|
92
105
|
}
|
93
106
|
},
|
94
107
|
|
@@ -298,7 +311,9 @@
|
|
298
311
|
rootModel = rootModel._superModel;
|
299
312
|
}
|
300
313
|
|
301
|
-
var coll = _.
|
314
|
+
var coll = _.find( this._collections, function(item) {
|
315
|
+
return item.model === rootModel;
|
316
|
+
});
|
302
317
|
|
303
318
|
if ( !coll && create !== false ) {
|
304
319
|
coll = this._createCollection( rootModel );
|
@@ -407,6 +422,7 @@
|
|
407
422
|
var modelColl = model.collection;
|
408
423
|
coll.add( model );
|
409
424
|
this.listenTo( model, 'destroy', this.unregister, this );
|
425
|
+
this.listenTo( model, 'relational:unregister', this.unregister, this );
|
410
426
|
model.collection = modelColl;
|
411
427
|
}
|
412
428
|
},
|
@@ -446,10 +462,10 @@
|
|
446
462
|
* Remove a 'model' from the store.
|
447
463
|
* @param {Backbone.RelationalModel} model
|
448
464
|
*/
|
449
|
-
unregister: function( model ) {
|
450
|
-
this.stopListening( model
|
465
|
+
unregister: function( model, collection, options ) {
|
466
|
+
this.stopListening( model );
|
451
467
|
var coll = this.getCollection( model );
|
452
|
-
coll && coll.remove( model );
|
468
|
+
coll && coll.remove( model, options );
|
453
469
|
},
|
454
470
|
|
455
471
|
/**
|
@@ -496,7 +512,12 @@
|
|
496
512
|
this.keyDestination = this.options.keyDestination || this.keySource || this.key;
|
497
513
|
|
498
514
|
this.model = this.options.model || this.instance.constructor;
|
515
|
+
|
499
516
|
this.relatedModel = this.options.relatedModel;
|
517
|
+
|
518
|
+
if ( _.isFunction( this.relatedModel ) && !( this.relatedModel.prototype instanceof Backbone.RelationalModel ) ) {
|
519
|
+
this.relatedModel = _.result( this, 'relatedModel' );
|
520
|
+
}
|
500
521
|
if ( _.isString( this.relatedModel ) ) {
|
501
522
|
this.relatedModel = Backbone.Relational.store.getObjectByName( this.relatedModel );
|
502
523
|
}
|
@@ -528,7 +549,7 @@
|
|
528
549
|
|
529
550
|
// Explicitly clear 'keySource', to prevent a leaky abstraction if 'keySource' differs from 'key'.
|
530
551
|
if ( this.keySource !== this.key ) {
|
531
|
-
this.instance.
|
552
|
+
delete this.instance.attributes[ this.keySource ];
|
532
553
|
}
|
533
554
|
|
534
555
|
// Add this Relation to instance._relations
|
@@ -829,6 +850,9 @@
|
|
829
850
|
|
830
851
|
// Handle a custom 'collectionType'
|
831
852
|
this.collectionType = this.options.collectionType;
|
853
|
+
if ( _.isFunction( this.collectionType ) && this.collectionType !== Backbone.Collection && !( this.collectionType.prototype instanceof Backbone.Collection ) ) {
|
854
|
+
this.collectionType = _.result( this, 'collectionType' );
|
855
|
+
}
|
832
856
|
if ( _.isString( this.collectionType ) ) {
|
833
857
|
this.collectionType = Backbone.Relational.store.getObjectByName( this.collectionType );
|
834
858
|
}
|
@@ -1064,6 +1088,7 @@
|
|
1064
1088
|
_isInitialized: false,
|
1065
1089
|
_deferProcessing: false,
|
1066
1090
|
_queue: null,
|
1091
|
+
_attributeChangeFired: false, // Keeps track of `change` event firing under some conditions (like nested `set`s)
|
1067
1092
|
|
1068
1093
|
subModelTypeAttribute: 'type',
|
1069
1094
|
subModelTypes: null,
|
@@ -1128,7 +1153,9 @@
|
|
1128
1153
|
// Determine if the `change` event is still valid, now that all relations are populated
|
1129
1154
|
var changed = true;
|
1130
1155
|
if ( eventName === 'change' ) {
|
1131
|
-
|
1156
|
+
// `hasChanged` may have gotten reset by nested calls to `set`.
|
1157
|
+
changed = dit.hasChanged() || dit._attributeChangeFired;
|
1158
|
+
dit._attributeChangeFired = false;
|
1132
1159
|
}
|
1133
1160
|
else {
|
1134
1161
|
var attr = eventName.slice( 7 ),
|
@@ -1137,7 +1164,7 @@
|
|
1137
1164
|
if ( rel ) {
|
1138
1165
|
// If `attr` is a relation, `change:attr` get triggered from `Relation.onChange`.
|
1139
1166
|
// These take precedence over `change:attr` events triggered by `Model.set`.
|
1140
|
-
// The relation
|
1167
|
+
// The relation sets a fourth attribute to `true`. If this attribute is present,
|
1141
1168
|
// continue triggering this event; otherwise, it's from `Model.set` and should be stopped.
|
1142
1169
|
changed = ( args[ 4 ] === true );
|
1143
1170
|
|
@@ -1152,6 +1179,9 @@
|
|
1152
1179
|
delete dit.changed[ attr ];
|
1153
1180
|
}
|
1154
1181
|
}
|
1182
|
+
else if ( changed ) {
|
1183
|
+
dit._attributeChangeFired = true;
|
1184
|
+
}
|
1155
1185
|
}
|
1156
1186
|
|
1157
1187
|
changed && Backbone.Model.prototype.trigger.apply( dit, args );
|
@@ -1172,7 +1202,7 @@
|
|
1172
1202
|
this.acquire(); // Setting up relations often also involve calls to 'set', and we only want to enter this function once
|
1173
1203
|
this._relations = {};
|
1174
1204
|
|
1175
|
-
_.each( this
|
1205
|
+
_.each( _.result( this, 'relations' ) || [], function( rel ) {
|
1176
1206
|
Backbone.Relational.store.initializeRelation( this, rel, options );
|
1177
1207
|
}, this );
|
1178
1208
|
|
@@ -1188,11 +1218,16 @@
|
|
1188
1218
|
updateRelations: function( options ) {
|
1189
1219
|
if ( this._isInitialized && !this.isLocked() ) {
|
1190
1220
|
_.each( this._relations, function( rel ) {
|
1191
|
-
// Update from data in `rel.keySource` if set, or `rel.key` otherwise
|
1221
|
+
// Update from data in `rel.keySource` if data got set in there, or `rel.key` otherwise
|
1192
1222
|
var val = this.attributes[ rel.keySource ] || this.attributes[ rel.key ];
|
1193
1223
|
if ( rel.related !== val ) {
|
1194
1224
|
this.trigger( 'relational:change:' + rel.key, this, val, options || {} );
|
1195
1225
|
}
|
1226
|
+
|
1227
|
+
// Explicitly clear 'keySource', to prevent a leaky abstraction if 'keySource' differs from 'key'.
|
1228
|
+
if ( rel.keySource !== rel.key ) {
|
1229
|
+
delete rel.instance.attributes[ rel.keySource ];
|
1230
|
+
}
|
1196
1231
|
}, this );
|
1197
1232
|
}
|
1198
1233
|
},
|
@@ -1244,7 +1279,7 @@
|
|
1244
1279
|
var setUrl,
|
1245
1280
|
requests = [],
|
1246
1281
|
rel = this.getRelation( key ),
|
1247
|
-
idsToFetch = rel && ( rel.keyIds || ( ( rel.keyId || rel.keyId === 0 ) ? [ rel.keyId ] : [] ) );
|
1282
|
+
idsToFetch = rel && ( ( rel.keyIds && rel.keyIds.slice( 0 ) ) || ( ( rel.keyId || rel.keyId === 0 ) ? [ rel.keyId ] : [] ) );
|
1248
1283
|
|
1249
1284
|
// On `refresh`, add the ids for current models in the relation to `idsToFetch`
|
1250
1285
|
if ( refresh ) {
|
@@ -1329,11 +1364,19 @@
|
|
1329
1364
|
// Go through all splits and return the final result
|
1330
1365
|
var splits = attr.split( '.' );
|
1331
1366
|
var result = _.reduce(splits, function( model, split ) {
|
1332
|
-
if (
|
1333
|
-
|
1367
|
+
if ( _.isNull(model) || _.isUndefined( model ) ) {
|
1368
|
+
// Return undefined if the path cannot be expanded
|
1369
|
+
return undefined;
|
1370
|
+
}
|
1371
|
+
else if ( model instanceof Backbone.Model ) {
|
1372
|
+
return Backbone.Model.prototype.get.call( model, split );
|
1373
|
+
}
|
1374
|
+
else if ( model instanceof Backbone.Collection ) {
|
1375
|
+
return Backbone.Collection.prototype.at.call( model, split )
|
1376
|
+
}
|
1377
|
+
else {
|
1378
|
+
throw new Error( 'Attribute must be an instanceof Backbone.Model or Backbone.Collection. Is: ' + model + ', currentSplit: ' + split );
|
1334
1379
|
}
|
1335
|
-
|
1336
|
-
return Backbone.Model.prototype.get.call( model, split );
|
1337
1380
|
}, this );
|
1338
1381
|
|
1339
1382
|
if ( originalResult !== undefined && result !== undefined ) {
|
@@ -1389,30 +1432,6 @@
|
|
1389
1432
|
return result;
|
1390
1433
|
},
|
1391
1434
|
|
1392
|
-
unset: function( attribute, options ) {
|
1393
|
-
Backbone.Relational.eventQueue.block();
|
1394
|
-
|
1395
|
-
var result = Backbone.Model.prototype.unset.apply( this, arguments );
|
1396
|
-
this.updateRelations( options );
|
1397
|
-
|
1398
|
-
// Try to run the global queue holding external events
|
1399
|
-
Backbone.Relational.eventQueue.unblock();
|
1400
|
-
|
1401
|
-
return result;
|
1402
|
-
},
|
1403
|
-
|
1404
|
-
clear: function( options ) {
|
1405
|
-
Backbone.Relational.eventQueue.block();
|
1406
|
-
|
1407
|
-
var result = Backbone.Model.prototype.clear.apply( this, arguments );
|
1408
|
-
this.updateRelations( options );
|
1409
|
-
|
1410
|
-
// Try to run the global queue holding external events
|
1411
|
-
Backbone.Relational.eventQueue.unblock();
|
1412
|
-
|
1413
|
-
return result;
|
1414
|
-
},
|
1415
|
-
|
1416
1435
|
clone: function() {
|
1417
1436
|
var attributes = _.clone( this.attributes );
|
1418
1437
|
if ( !_.isUndefined( attributes[ this.idAttribute ] ) ) {
|
@@ -1569,57 +1588,92 @@
|
|
1569
1588
|
* @return {Backbone.Model}
|
1570
1589
|
*/
|
1571
1590
|
build: function( attributes, options ) {
|
1572
|
-
var model = this;
|
1573
|
-
|
1574
1591
|
// 'build' is a possible entrypoint; it's possible no model hierarchy has been determined yet.
|
1575
1592
|
this.initializeModelHierarchy();
|
1576
1593
|
|
1577
1594
|
// Determine what type of (sub)model should be built if applicable.
|
1578
|
-
|
1579
|
-
|
1580
|
-
|
1581
|
-
|
1595
|
+
var model = this._findSubModelType(this, attributes) || this;
|
1596
|
+
|
1597
|
+
return new model( attributes, options );
|
1598
|
+
},
|
1599
|
+
|
1600
|
+
/**
|
1601
|
+
* Determines what type of (sub)model should be built if applicable.
|
1602
|
+
* Looks up the proper subModelType in 'this._subModels', recursing into
|
1603
|
+
* types until a match is found. Returns the applicable 'Backbone.Model'
|
1604
|
+
* or null if no match is found.
|
1605
|
+
* @param {Backbone.Model} type
|
1606
|
+
* @param {Object} attributes
|
1607
|
+
* @return {Backbone.Model}
|
1608
|
+
*/
|
1609
|
+
_findSubModelType: function (type, attributes) {
|
1610
|
+
if ( type._subModels && type.prototype.subModelTypeAttribute in attributes ) {
|
1611
|
+
var subModelTypeAttribute = attributes[type.prototype.subModelTypeAttribute];
|
1612
|
+
var subModelType = type._subModels[subModelTypeAttribute];
|
1582
1613
|
if ( subModelType ) {
|
1583
|
-
|
1614
|
+
return subModelType;
|
1615
|
+
} else {
|
1616
|
+
// Recurse into subModelTypes to find a match
|
1617
|
+
for ( subModelTypeAttribute in type._subModels ) {
|
1618
|
+
subModelType = this._findSubModelType(type._subModels[subModelTypeAttribute], attributes);
|
1619
|
+
if ( subModelType ) {
|
1620
|
+
return subModelType;
|
1621
|
+
}
|
1622
|
+
}
|
1584
1623
|
}
|
1585
1624
|
}
|
1586
|
-
|
1587
|
-
return new model( attributes, options );
|
1625
|
+
return null;
|
1588
1626
|
},
|
1589
1627
|
|
1590
1628
|
/**
|
1591
1629
|
*
|
1592
1630
|
*/
|
1593
1631
|
initializeModelHierarchy: function() {
|
1594
|
-
//
|
1595
|
-
|
1596
|
-
|
1597
|
-
|
1598
|
-
|
1599
|
-
|
1600
|
-
|
1601
|
-
|
1602
|
-
|
1603
|
-
|
1632
|
+
// Inherit any relations that have been defined in the parent model.
|
1633
|
+
this.inheritRelations();
|
1634
|
+
|
1635
|
+
// If we came here through 'build' for a model that has 'subModelTypes' then try to initialize the ones that
|
1636
|
+
// haven't been resolved yet.
|
1637
|
+
if ( this.prototype.subModelTypes ) {
|
1638
|
+
var resolvedSubModels = _.keys(this._subModels);
|
1639
|
+
var unresolvedSubModels = _.omit(this.prototype.subModelTypes, resolvedSubModels);
|
1640
|
+
_.each( unresolvedSubModels, function( subModelTypeName ) {
|
1641
|
+
var subModelType = Backbone.Relational.store.getObjectByName( subModelTypeName );
|
1642
|
+
subModelType && subModelType.initializeModelHierarchy();
|
1643
|
+
});
|
1644
|
+
}
|
1645
|
+
},
|
1646
|
+
|
1647
|
+
inheritRelations: function() {
|
1648
|
+
// Bail out if we've been here before.
|
1649
|
+
if (!_.isUndefined( this._superModel ) && !_.isNull( this._superModel )) {
|
1650
|
+
return;
|
1651
|
+
}
|
1652
|
+
// Try to initialize the _superModel.
|
1653
|
+
Backbone.Relational.store.setupSuperModel( this );
|
1654
|
+
|
1655
|
+
// If a superModel has been found, copy relations from the _superModel if they haven't been inherited automatically
|
1656
|
+
// (due to a redefinition of 'relations').
|
1657
|
+
if ( this._superModel ) {
|
1658
|
+
// The _superModel needs a chance to initialize its own inherited relations before we attempt to inherit relations
|
1659
|
+
// from the _superModel. You don't want to call 'initializeModelHierarchy' because that could cause sub-models of
|
1660
|
+
// this class to inherit their relations before this class has had chance to inherit it's relations.
|
1661
|
+
this._superModel.inheritRelations();
|
1662
|
+
if ( this._superModel.prototype.relations ) {
|
1663
|
+
// Find relations that exist on the '_superModel', but not yet on this model.
|
1604
1664
|
var inheritedRelations = _.select( this._superModel.prototype.relations || [], function( superRel ) {
|
1605
1665
|
return !_.any( this.prototype.relations || [], function( rel ) {
|
1606
1666
|
return superRel.relatedModel === rel.relatedModel && superRel.key === rel.key;
|
1607
1667
|
}, this );
|
1608
1668
|
}, this );
|
1609
|
-
|
1669
|
+
|
1610
1670
|
this.prototype.relations = inheritedRelations.concat( this.prototype.relations );
|
1611
1671
|
}
|
1612
|
-
else {
|
1613
|
-
this._superModel = false;
|
1614
|
-
}
|
1615
1672
|
}
|
1616
|
-
|
1617
|
-
//
|
1618
|
-
|
1619
|
-
|
1620
|
-
var subModelType = Backbone.Relational.store.getObjectByName( subModelTypeName );
|
1621
|
-
subModelType && subModelType.initializeModelHierarchy();
|
1622
|
-
});
|
1673
|
+
// Otherwise, make sure we don't get here again for this type by making '_superModel' false so we fail the
|
1674
|
+
// isUndefined/isNull check next time.
|
1675
|
+
else {
|
1676
|
+
this._superModel = false;
|
1623
1677
|
}
|
1624
1678
|
},
|
1625
1679
|
|
@@ -1638,7 +1692,7 @@
|
|
1638
1692
|
findOrCreate: function( attributes, options ) {
|
1639
1693
|
options || ( options = {} );
|
1640
1694
|
var parsedAttributes = ( _.isObject( attributes ) && options.parse && this.prototype.parse ) ?
|
1641
|
-
this.prototype.parse( attributes ) : attributes;
|
1695
|
+
this.prototype.parse( _.clone( attributes ) ) : attributes;
|
1642
1696
|
|
1643
1697
|
// Try to find an instance of 'this' model type in the store
|
1644
1698
|
var model = Backbone.Relational.store.find( this, parsedAttributes );
|
@@ -1647,8 +1701,9 @@
|
|
1647
1701
|
// If not, create an instance (unless 'options.create' is false).
|
1648
1702
|
if ( _.isObject( attributes ) ) {
|
1649
1703
|
if ( model && options.merge !== false ) {
|
1650
|
-
// Make sure `options.collection` doesn't cascade to nested models
|
1704
|
+
// Make sure `options.collection` and `options.url` doesn't cascade to nested models
|
1651
1705
|
delete options.collection;
|
1706
|
+
delete options.url;
|
1652
1707
|
|
1653
1708
|
model.set( parsedAttributes, options );
|
1654
1709
|
}
|
@@ -1658,6 +1713,22 @@
|
|
1658
1713
|
}
|
1659
1714
|
|
1660
1715
|
return model;
|
1716
|
+
},
|
1717
|
+
|
1718
|
+
/**
|
1719
|
+
* Find an instance of `this` type in 'Backbone.Relational.store'.
|
1720
|
+
* - If `attributes` is a string or a number, `find` will just query the `store` and return a model if found.
|
1721
|
+
* - If `attributes` is an object and is found in the store, the model will be updated with `attributes` unless `options.update` is `false`.
|
1722
|
+
* @param {Object|String|Number} attributes Either a model's id, or the attributes used to create or update a model.
|
1723
|
+
* @param {Object} [options]
|
1724
|
+
* @param {Boolean} [options.merge=true]
|
1725
|
+
* @param {Boolean} [options.parse=false]
|
1726
|
+
* @return {Backbone.RelationalModel}
|
1727
|
+
*/
|
1728
|
+
find: function( attributes, options ) {
|
1729
|
+
options || ( options = {} );
|
1730
|
+
options.create = false;
|
1731
|
+
return this.findOrCreate( attributes, options );
|
1661
1732
|
}
|
1662
1733
|
});
|
1663
1734
|
_.extend( Backbone.RelationalModel.prototype, Backbone.Semaphore );
|
@@ -1765,14 +1836,14 @@
|
|
1765
1836
|
return remove.apply( this, arguments );
|
1766
1837
|
}
|
1767
1838
|
|
1768
|
-
models = _.isArray( models ) ? models.slice() : [ models ];
|
1839
|
+
models = _.isArray( models ) ? models.slice( 0 ) : [ models ];
|
1769
1840
|
options || ( options = {} );
|
1770
1841
|
|
1771
1842
|
var toRemove = [];
|
1772
1843
|
|
1773
1844
|
//console.debug('calling remove on coll=%o; models=%o, options=%o', this, models, options );
|
1774
1845
|
_.each( models, function( model ) {
|
1775
|
-
model = this.get( model ) || this.get( model.cid );
|
1846
|
+
model = this.get( model ) || ( model && this.get( model.cid ) );
|
1776
1847
|
model && toRemove.push( model );
|
1777
1848
|
}, this );
|
1778
1849
|
|
@@ -1827,7 +1898,7 @@
|
|
1827
1898
|
return trigger.apply( this, arguments );
|
1828
1899
|
}
|
1829
1900
|
|
1830
|
-
if ( eventName === 'add' || eventName === 'remove' || eventName === 'reset' ) {
|
1901
|
+
if ( eventName === 'add' || eventName === 'remove' || eventName === 'reset' || eventName === 'sort' ) {
|
1831
1902
|
var dit = this,
|
1832
1903
|
args = arguments;
|
1833
1904
|
|
metadata
CHANGED
@@ -1,30 +1,27 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: backbone-relational-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
5
|
-
prerelease:
|
4
|
+
version: 0.8.6
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Peter Marsh
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-
|
11
|
+
date: 2013-08-19 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: railties
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '3.1'
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - '>='
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '3.1'
|
30
27
|
description: Backbone-relational provides one-to-one, one-to-many and many-to-one
|
@@ -35,41 +32,34 @@ executables: []
|
|
35
32
|
extensions: []
|
36
33
|
extra_rdoc_files: []
|
37
34
|
files:
|
38
|
-
- lib/backbone-relational-rails.rb
|
39
35
|
- lib/backbone-relational-rails/version.rb
|
36
|
+
- lib/backbone-relational-rails.rb
|
40
37
|
- vendor/assets/javascripts/backbone-relational.js
|
41
38
|
- LICENSE
|
42
39
|
- README.md
|
43
40
|
homepage: http://github.com/petedmarsh/backbone-relational-rails
|
44
41
|
licenses:
|
45
42
|
- MIT
|
43
|
+
metadata: {}
|
46
44
|
post_install_message:
|
47
45
|
rdoc_options: []
|
48
46
|
require_paths:
|
49
47
|
- lib
|
50
48
|
- vendor
|
51
49
|
required_ruby_version: !ruby/object:Gem::Requirement
|
52
|
-
none: false
|
53
50
|
requirements:
|
54
|
-
- -
|
51
|
+
- - '>='
|
55
52
|
- !ruby/object:Gem::Version
|
56
53
|
version: '0'
|
57
|
-
segments:
|
58
|
-
- 0
|
59
|
-
hash: -3926763858083606606
|
60
54
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
61
|
-
none: false
|
62
55
|
requirements:
|
63
|
-
- -
|
56
|
+
- - '>='
|
64
57
|
- !ruby/object:Gem::Version
|
65
58
|
version: '0'
|
66
|
-
segments:
|
67
|
-
- 0
|
68
|
-
hash: -3926763858083606606
|
69
59
|
requirements: []
|
70
60
|
rubyforge_project:
|
71
|
-
rubygems_version:
|
61
|
+
rubygems_version: 2.0.3
|
72
62
|
signing_key:
|
73
|
-
specification_version:
|
63
|
+
specification_version: 4
|
74
64
|
summary: Backbone-relational packaged for Rails
|
75
65
|
test_files: []
|