backbone-relational-rails 0.8.0 → 0.8.5
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +2 -2
- data/lib/backbone-relational-rails/version.rb +1 -1
- data/vendor/assets/javascripts/backbone-relational.js +150 -92
- metadata +4 -4
data/README.md
CHANGED
@@ -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.5 == Backbone-relational 0.8.5
|
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
|
@@ -26,7 +26,7 @@ bug be discovered, a 4th version identifier will be added and incremented.
|
|
26
26
|
|
27
27
|
## Backbone Version
|
28
28
|
|
29
|
-
This release of Backbone-relational is only compatible with Backbone >= 0.
|
29
|
+
This release of Backbone-relational is only compatible with Backbone >= 1.0.0.
|
30
30
|
|
31
31
|
## Acknowledgements
|
32
32
|
|
@@ -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.5
|
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.
|
@@ -149,6 +149,14 @@
|
|
149
149
|
this._modelScopes.push( scope );
|
150
150
|
},
|
151
151
|
|
152
|
+
/**
|
153
|
+
* Remove a scope.
|
154
|
+
* @param {Object} scope
|
155
|
+
*/
|
156
|
+
removeModelScope: function( scope ) {
|
157
|
+
this._modelScopes = _.without( this._modelScopes, scope );
|
158
|
+
},
|
159
|
+
|
152
160
|
/**
|
153
161
|
* Add a set of subModelTypes to the store, that can be used to resolve the '_superModel'
|
154
162
|
* for a model later in 'setupSuperModel'.
|
@@ -367,7 +375,7 @@
|
|
367
375
|
},
|
368
376
|
|
369
377
|
/**
|
370
|
-
*
|
378
|
+
* Find a specific model of a certain `type` in the store
|
371
379
|
* @param type
|
372
380
|
* @param {String|Number|Object|Backbone.RelationalModel} item
|
373
381
|
*/
|
@@ -396,13 +404,6 @@
|
|
396
404
|
var coll = this.getCollection( model );
|
397
405
|
|
398
406
|
if ( coll ) {
|
399
|
-
if ( coll.get( model ) ) {
|
400
|
-
if ( Backbone.Relational.showWarnings && typeof console !== 'undefined' ) {
|
401
|
-
console.warn( 'Duplicate id! Old RelationalModel=%o, new RelationalModel=%o', coll.get( model ), model );
|
402
|
-
}
|
403
|
-
throw new Error( "Cannot instantiate more than one Backbone.RelationalModel with the same id per type!" );
|
404
|
-
}
|
405
|
-
|
406
407
|
var modelColl = model.collection;
|
407
408
|
coll.add( model );
|
408
409
|
this.listenTo( model, 'destroy', this.unregister, this );
|
@@ -410,13 +411,35 @@
|
|
410
411
|
}
|
411
412
|
},
|
412
413
|
|
414
|
+
/**
|
415
|
+
* Check if the given model may use the given `id`
|
416
|
+
* @param model
|
417
|
+
* @param [id]
|
418
|
+
*/
|
419
|
+
checkId: function( model, id ) {
|
420
|
+
var coll = this.getCollection( model ),
|
421
|
+
duplicate = coll && coll.get( id );
|
422
|
+
|
423
|
+
if ( duplicate && model !== duplicate ) {
|
424
|
+
if ( Backbone.Relational.showWarnings && typeof console !== 'undefined' ) {
|
425
|
+
console.warn( 'Duplicate id! Old RelationalModel=%o, new RelationalModel=%o', duplicate, model );
|
426
|
+
}
|
427
|
+
|
428
|
+
throw new Error( "Cannot instantiate more than one Backbone.RelationalModel with the same id per type!" );
|
429
|
+
}
|
430
|
+
},
|
431
|
+
|
413
432
|
/**
|
414
433
|
* Explicitly update a model's id in its store collection
|
415
434
|
* @param {Backbone.RelationalModel} model
|
416
|
-
|
435
|
+
*/
|
417
436
|
update: function( model ) {
|
418
437
|
var coll = this.getCollection( model );
|
438
|
+
// This triggers updating the lookup indices kept in a collection
|
419
439
|
coll._onModelEvent( 'change:' + model.idAttribute, model, coll );
|
440
|
+
|
441
|
+
// Trigger an event on model so related models (having the model's new id in their keyContents) can add it.
|
442
|
+
model.trigger( 'relational:change:id', model, coll );
|
420
443
|
},
|
421
444
|
|
422
445
|
/**
|
@@ -519,7 +542,7 @@
|
|
519
542
|
|
520
543
|
// When 'relatedModel' are created or destroyed, check if it affects this relation.
|
521
544
|
this.listenTo( this.instance, 'destroy', this.destroy )
|
522
|
-
.listenTo( this.relatedCollection, 'relational:add', this.tryAddRelated )
|
545
|
+
.listenTo( this.relatedCollection, 'relational:add relational:change:id', this.tryAddRelated )
|
523
546
|
.listenTo( this.relatedCollection, 'relational:remove', this.removeRelated )
|
524
547
|
}
|
525
548
|
};
|
@@ -688,6 +711,11 @@
|
|
688
711
|
related = this.relatedModel.findOrCreate( this.keyContents, opts );
|
689
712
|
}
|
690
713
|
|
714
|
+
// Nullify `keyId` if we have a related model; in case it was already part of the relation
|
715
|
+
if ( this.related ) {
|
716
|
+
this.keyId = null;
|
717
|
+
}
|
718
|
+
|
691
719
|
return related;
|
692
720
|
},
|
693
721
|
|
@@ -804,7 +832,7 @@
|
|
804
832
|
if ( _.isString( this.collectionType ) ) {
|
805
833
|
this.collectionType = Backbone.Relational.store.getObjectByName( this.collectionType );
|
806
834
|
}
|
807
|
-
if ( !this.collectionType.prototype instanceof Backbone.Collection ){
|
835
|
+
if ( this.collectionType !== Backbone.Collection && !( this.collectionType.prototype instanceof Backbone.Collection ) ) {
|
808
836
|
throw new Error( '`collectionType` must inherit from Backbone.Collection' );
|
809
837
|
}
|
810
838
|
|
@@ -878,7 +906,9 @@
|
|
878
906
|
}
|
879
907
|
else {
|
880
908
|
// If `merge` is true, update models here, instead of during update.
|
881
|
-
model = this.relatedModel.findOrCreate( attributes,
|
909
|
+
model = this.relatedModel.findOrCreate( attributes,
|
910
|
+
_.extend( { merge: true }, options, { create: this.options.createModels } )
|
911
|
+
);
|
882
912
|
}
|
883
913
|
|
884
914
|
model && toAdd.push( model );
|
@@ -891,9 +921,14 @@
|
|
891
921
|
related = this._prepareCollection();
|
892
922
|
}
|
893
923
|
|
894
|
-
|
924
|
+
// By now, both `merge` and `parse` will already have been executed for models if they were specified.
|
925
|
+
// Disable them to prevent additional calls.
|
926
|
+
related.set( toAdd, _.defaults( { merge: false, parse: false }, options ) );
|
895
927
|
}
|
896
928
|
|
929
|
+
// Remove entries from `keyIds` that were already part of the relation (and are thus 'unchanged')
|
930
|
+
this.keyIds = _.difference( this.keyIds, _.pluck( related.models, 'id' ) );
|
931
|
+
|
897
932
|
return related;
|
898
933
|
},
|
899
934
|
|
@@ -1004,7 +1039,7 @@
|
|
1004
1039
|
var dit = this;
|
1005
1040
|
model.queue( function() {
|
1006
1041
|
if ( dit.related && !dit.related.get( model ) ) {
|
1007
|
-
dit.related.add( model, options );
|
1042
|
+
dit.related.add( model, _.defaults( { parse: false }, options ) );
|
1008
1043
|
}
|
1009
1044
|
});
|
1010
1045
|
},
|
@@ -1037,12 +1072,12 @@
|
|
1037
1072
|
// Nasty hack, for cases like 'model.get( <HasMany key> ).add( item )'.
|
1038
1073
|
// Defer 'processQueue', so that when 'Relation.createModels' is used we trigger 'HasMany'
|
1039
1074
|
// collection events only after the model is really fully set up.
|
1040
|
-
// Example: "p.get('jobs').add( { company: c, person: p } )".
|
1075
|
+
// Example: event for "p.on( 'add:jobs' )" -> "p.get('jobs').add( { company: c.id, person: p.id } )".
|
1041
1076
|
if ( options && options.collection ) {
|
1042
1077
|
var dit = this,
|
1043
1078
|
collection = this.collection = options.collection;
|
1044
1079
|
|
1045
|
-
// Prevent
|
1080
|
+
// Prevent `collection` from cascading down to nested models; they shouldn't go into this `if` clause.
|
1046
1081
|
delete options.collection;
|
1047
1082
|
|
1048
1083
|
this._deferProcessing = true;
|
@@ -1125,7 +1160,7 @@
|
|
1125
1160
|
else {
|
1126
1161
|
Backbone.Model.prototype.trigger.apply( this, arguments );
|
1127
1162
|
}
|
1128
|
-
|
1163
|
+
|
1129
1164
|
return this;
|
1130
1165
|
},
|
1131
1166
|
|
@@ -1136,11 +1171,11 @@
|
|
1136
1171
|
initializeRelations: function( options ) {
|
1137
1172
|
this.acquire(); // Setting up relations often also involve calls to 'set', and we only want to enter this function once
|
1138
1173
|
this._relations = {};
|
1139
|
-
|
1174
|
+
|
1140
1175
|
_.each( this.relations || [], function( rel ) {
|
1141
1176
|
Backbone.Relational.store.initializeRelation( this, rel, options );
|
1142
1177
|
}, this );
|
1143
|
-
|
1178
|
+
|
1144
1179
|
this._isInitialized = true;
|
1145
1180
|
this.release();
|
1146
1181
|
this.processQueue();
|
@@ -1209,15 +1244,22 @@
|
|
1209
1244
|
var setUrl,
|
1210
1245
|
requests = [],
|
1211
1246
|
rel = this.getRelation( key ),
|
1212
|
-
|
1213
|
-
|
1214
|
-
|
1215
|
-
|
1216
|
-
|
1217
|
-
|
1247
|
+
idsToFetch = rel && ( rel.keyIds || ( ( rel.keyId || rel.keyId === 0 ) ? [ rel.keyId ] : [] ) );
|
1248
|
+
|
1249
|
+
// On `refresh`, add the ids for current models in the relation to `idsToFetch`
|
1250
|
+
if ( refresh ) {
|
1251
|
+
var models = rel.related instanceof Backbone.Collection ? rel.related.models : [ rel.related ];
|
1252
|
+
_.each( models, function( model ) {
|
1253
|
+
if ( model.id || model.id === 0 ) {
|
1254
|
+
idsToFetch.push( model.id );
|
1255
|
+
}
|
1256
|
+
});
|
1257
|
+
}
|
1258
|
+
|
1259
|
+
if ( idsToFetch && idsToFetch.length ) {
|
1218
1260
|
// Find (or create) a model for each one that is to be fetched
|
1219
1261
|
var created = [],
|
1220
|
-
models = _.map(
|
1262
|
+
models = _.map( idsToFetch, function( id ) {
|
1221
1263
|
var model = Backbone.Relational.store.find( rel.relatedModel, id );
|
1222
1264
|
|
1223
1265
|
if ( !model ) {
|
@@ -1234,7 +1276,7 @@
|
|
1234
1276
|
if ( rel.related instanceof Backbone.Collection && _.isFunction( rel.related.url ) ) {
|
1235
1277
|
setUrl = rel.related.url( models );
|
1236
1278
|
}
|
1237
|
-
|
1279
|
+
|
1238
1280
|
// An assumption is that when 'Backbone.Collection.url' is a function, it can handle building of set urls.
|
1239
1281
|
// To make sure it can, test if the url we got by supplying a list of models to fetch is different from
|
1240
1282
|
// the one supplied for the default fetch action (without args to 'url').
|
@@ -1303,7 +1345,7 @@
|
|
1303
1345
|
|
1304
1346
|
set: function( key, value, options ) {
|
1305
1347
|
Backbone.Relational.eventQueue.block();
|
1306
|
-
|
1348
|
+
|
1307
1349
|
// Duplicate backbone's behavior to allow separate key/value parameters, instead of a single 'attributes' object
|
1308
1350
|
var attributes;
|
1309
1351
|
if ( _.isObject( key ) || key == null ) {
|
@@ -1314,20 +1356,24 @@
|
|
1314
1356
|
attributes = {};
|
1315
1357
|
attributes[ key ] = value;
|
1316
1358
|
}
|
1317
|
-
|
1318
|
-
var result = Backbone.Model.prototype.set.apply( this, arguments );
|
1319
|
-
|
1320
|
-
// Ideal place to set up relations :)
|
1359
|
+
|
1321
1360
|
try {
|
1361
|
+
var id = this.id,
|
1362
|
+
newId = attributes && this.idAttribute in attributes && attributes[ this.idAttribute ];
|
1363
|
+
|
1364
|
+
// Check if we're not setting a duplicate id before actually calling `set`.
|
1365
|
+
Backbone.Relational.store.checkId( this, newId );
|
1366
|
+
|
1367
|
+
var result = Backbone.Model.prototype.set.apply( this, arguments );
|
1368
|
+
|
1369
|
+
// Ideal place to set up relations, if this is the first time we're here for this model
|
1322
1370
|
if ( !this._isInitialized && !this.isLocked() ) {
|
1323
1371
|
this.constructor.initializeModelHierarchy();
|
1324
|
-
|
1325
1372
|
Backbone.Relational.store.register( this );
|
1326
|
-
|
1327
1373
|
this.initializeRelations( options );
|
1328
1374
|
}
|
1329
|
-
//
|
1330
|
-
else if (
|
1375
|
+
// The store should know about an `id` update asap
|
1376
|
+
else if ( newId && newId !== id ) {
|
1331
1377
|
Backbone.Relational.store.update( this );
|
1332
1378
|
}
|
1333
1379
|
|
@@ -1345,13 +1391,13 @@
|
|
1345
1391
|
|
1346
1392
|
unset: function( attribute, options ) {
|
1347
1393
|
Backbone.Relational.eventQueue.block();
|
1348
|
-
|
1394
|
+
|
1349
1395
|
var result = Backbone.Model.prototype.unset.apply( this, arguments );
|
1350
1396
|
this.updateRelations( options );
|
1351
|
-
|
1397
|
+
|
1352
1398
|
// Try to run the global queue holding external events
|
1353
1399
|
Backbone.Relational.eventQueue.unblock();
|
1354
|
-
|
1400
|
+
|
1355
1401
|
return result;
|
1356
1402
|
},
|
1357
1403
|
|
@@ -1360,10 +1406,10 @@
|
|
1360
1406
|
|
1361
1407
|
var result = Backbone.Model.prototype.clear.apply( this, arguments );
|
1362
1408
|
this.updateRelations( options );
|
1363
|
-
|
1409
|
+
|
1364
1410
|
// Try to run the global queue holding external events
|
1365
1411
|
Backbone.Relational.eventQueue.unblock();
|
1366
|
-
|
1412
|
+
|
1367
1413
|
return result;
|
1368
1414
|
},
|
1369
1415
|
|
@@ -1388,63 +1434,68 @@
|
|
1388
1434
|
if ( this.isLocked() ) {
|
1389
1435
|
return this.id;
|
1390
1436
|
}
|
1391
|
-
|
1437
|
+
|
1392
1438
|
this.acquire();
|
1393
1439
|
var json = Backbone.Model.prototype.toJSON.call( this, options );
|
1394
|
-
|
1440
|
+
|
1395
1441
|
if ( this.constructor._superModel && !( this.constructor._subModelTypeAttribute in json ) ) {
|
1396
1442
|
json[ this.constructor._subModelTypeAttribute ] = this.constructor._subModelTypeValue;
|
1397
1443
|
}
|
1398
|
-
|
1444
|
+
|
1399
1445
|
_.each( this._relations, function( rel ) {
|
1400
|
-
var
|
1446
|
+
var related = json[ rel.key ],
|
1447
|
+
includeInJSON = rel.options.includeInJSON,
|
1448
|
+
value = null;
|
1401
1449
|
|
1402
|
-
if (
|
1403
|
-
if (
|
1404
|
-
|
1405
|
-
}
|
1406
|
-
else {
|
1407
|
-
json[ rel.keyDestination ] = null;
|
1450
|
+
if ( includeInJSON === true ) {
|
1451
|
+
if ( related && _.isFunction( related.toJSON ) ) {
|
1452
|
+
value = related.toJSON( options );
|
1408
1453
|
}
|
1409
1454
|
}
|
1410
|
-
else if ( _.isString(
|
1411
|
-
if (
|
1412
|
-
|
1455
|
+
else if ( _.isString( includeInJSON ) ) {
|
1456
|
+
if ( related instanceof Backbone.Collection ) {
|
1457
|
+
value = related.pluck( includeInJSON );
|
1413
1458
|
}
|
1414
|
-
else if (
|
1415
|
-
|
1459
|
+
else if ( related instanceof Backbone.Model ) {
|
1460
|
+
value = related.get( includeInJSON );
|
1416
1461
|
}
|
1417
|
-
|
1418
|
-
|
1462
|
+
|
1463
|
+
// Add ids for 'unfound' models if includeInJSON is equal to (only) the relatedModel's `idAttribute`
|
1464
|
+
if ( includeInJSON === rel.relatedModel.prototype.idAttribute ) {
|
1465
|
+
if ( rel instanceof Backbone.HasMany ) {
|
1466
|
+
value = value.concat( rel.keyIds );
|
1467
|
+
}
|
1468
|
+
else if ( rel instanceof Backbone.HasOne ) {
|
1469
|
+
value = value || rel.keyId;
|
1470
|
+
}
|
1419
1471
|
}
|
1420
1472
|
}
|
1421
|
-
else if ( _.isArray(
|
1422
|
-
if (
|
1423
|
-
|
1424
|
-
|
1473
|
+
else if ( _.isArray( includeInJSON ) ) {
|
1474
|
+
if ( related instanceof Backbone.Collection ) {
|
1475
|
+
value = [];
|
1476
|
+
related.each( function( model ) {
|
1425
1477
|
var curJson = {};
|
1426
|
-
_.each(
|
1478
|
+
_.each( includeInJSON, function( key ) {
|
1427
1479
|
curJson[ key ] = model.get( key );
|
1428
1480
|
});
|
1429
|
-
|
1481
|
+
value.push( curJson );
|
1430
1482
|
});
|
1431
|
-
json[ rel.keyDestination ] = valueSub;
|
1432
1483
|
}
|
1433
|
-
else if (
|
1434
|
-
|
1435
|
-
_.each(
|
1436
|
-
|
1484
|
+
else if ( related instanceof Backbone.Model ) {
|
1485
|
+
value = {};
|
1486
|
+
_.each( includeInJSON, function( key ) {
|
1487
|
+
value[ key ] = related.get( key );
|
1437
1488
|
});
|
1438
|
-
json[ rel.keyDestination ] = valueSub;
|
1439
|
-
}
|
1440
|
-
else {
|
1441
|
-
json[ rel.keyDestination ] = null;
|
1442
1489
|
}
|
1443
1490
|
}
|
1444
1491
|
else {
|
1445
1492
|
delete json[ rel.key ];
|
1446
1493
|
}
|
1447
1494
|
|
1495
|
+
if ( includeInJSON ) {
|
1496
|
+
json[ rel.keyDestination ] = value;
|
1497
|
+
}
|
1498
|
+
|
1448
1499
|
if ( rel.keyDestination !== rel.key ) {
|
1449
1500
|
delete json[ rel.key ];
|
1450
1501
|
}
|
@@ -1548,17 +1599,15 @@
|
|
1548
1599
|
// inherited automatically (due to a redefinition of 'relations').
|
1549
1600
|
// Otherwise, make sure we don't get here again for this type by making '_superModel' false so we fail
|
1550
1601
|
// the isUndefined/isNull check next time.
|
1551
|
-
if ( this._superModel ) {
|
1552
|
-
//
|
1553
|
-
|
1554
|
-
|
1555
|
-
return rel.
|
1602
|
+
if ( this._superModel && this._superModel.prototype.relations ) {
|
1603
|
+
// Find relations that exist on the `_superModel`, but not yet on this model.
|
1604
|
+
var inheritedRelations = _.select( this._superModel.prototype.relations || [], function( superRel ) {
|
1605
|
+
return !_.any( this.prototype.relations || [], function( rel ) {
|
1606
|
+
return superRel.relatedModel === rel.relatedModel && superRel.key === rel.key;
|
1556
1607
|
}, this );
|
1608
|
+
}, this );
|
1557
1609
|
|
1558
|
-
|
1559
|
-
this.prototype.relations = this._superModel.prototype.relations.concat( this.prototype.relations );
|
1560
|
-
}
|
1561
|
-
}
|
1610
|
+
this.prototype.relations = inheritedRelations.concat( this.prototype.relations );
|
1562
1611
|
}
|
1563
1612
|
else {
|
1564
1613
|
this._superModel = false;
|
@@ -1598,6 +1647,9 @@
|
|
1598
1647
|
// If not, create an instance (unless 'options.create' is false).
|
1599
1648
|
if ( _.isObject( attributes ) ) {
|
1600
1649
|
if ( model && options.merge !== false ) {
|
1650
|
+
// Make sure `options.collection` doesn't cascade to nested models
|
1651
|
+
delete options.collection;
|
1652
|
+
|
1601
1653
|
model.set( parsedAttributes, options );
|
1602
1654
|
}
|
1603
1655
|
else if ( !model && options.create !== false ) {
|
@@ -1627,7 +1679,7 @@
|
|
1627
1679
|
model = attrs;
|
1628
1680
|
}
|
1629
1681
|
else {
|
1630
|
-
options || (options = {});
|
1682
|
+
options || ( options = {} );
|
1631
1683
|
options.collection = this;
|
1632
1684
|
|
1633
1685
|
if ( typeof this.model.findOrCreate !== 'undefined' ) {
|
@@ -1648,19 +1700,23 @@
|
|
1648
1700
|
|
1649
1701
|
|
1650
1702
|
/**
|
1651
|
-
* Override Backbone.Collection.
|
1703
|
+
* Override Backbone.Collection.set, so we'll create objects from attributes where required,
|
1652
1704
|
* and update the existing models. Also, trigger 'relational:add'.
|
1653
1705
|
*/
|
1654
|
-
var
|
1655
|
-
Backbone.Collection.prototype.
|
1706
|
+
var set = Backbone.Collection.prototype.__set = Backbone.Collection.prototype.set;
|
1707
|
+
Backbone.Collection.prototype.set = function( models, options ) {
|
1656
1708
|
// Short-circuit if this Collection doesn't hold RelationalModels
|
1657
1709
|
if ( !( this.model.prototype instanceof Backbone.RelationalModel ) ) {
|
1658
|
-
return
|
1710
|
+
return set.apply( this, arguments );
|
1659
1711
|
}
|
1660
1712
|
|
1661
|
-
|
1662
|
-
|
1663
|
-
|
1713
|
+
if ( options && options.parse ) {
|
1714
|
+
models = this.parse( models, options );
|
1715
|
+
}
|
1716
|
+
|
1717
|
+
if ( !_.isArray( models ) ) {
|
1718
|
+
models = models ? [ models ] : [];
|
1719
|
+
}
|
1664
1720
|
|
1665
1721
|
var newModels = [],
|
1666
1722
|
toAdd = [];
|
@@ -1686,7 +1742,8 @@
|
|
1686
1742
|
}, this );
|
1687
1743
|
|
1688
1744
|
// Add 'models' in a single batch, so the original add will only be called once (and thus 'sort', etc).
|
1689
|
-
|
1745
|
+
// If `parse` was specified, the collection and contained models have been parsed now.
|
1746
|
+
set.call( this, toAdd, _.defaults( { parse: false }, options ) );
|
1690
1747
|
|
1691
1748
|
_.each( newModels, function( model ) {
|
1692
1749
|
// Fire a `relational:add` event for any model in `newModels` that has actually been added to the collection.
|
@@ -1735,6 +1792,7 @@
|
|
1735
1792
|
*/
|
1736
1793
|
var reset = Backbone.Collection.prototype.__reset = Backbone.Collection.prototype.reset;
|
1737
1794
|
Backbone.Collection.prototype.reset = function( models, options ) {
|
1795
|
+
options = _.extend( { merge: true }, options );
|
1738
1796
|
reset.call( this, models, options );
|
1739
1797
|
|
1740
1798
|
if ( this.model.prototype instanceof Backbone.RelationalModel ) {
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: backbone-relational-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-04-11 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: railties
|
@@ -56,7 +56,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
56
56
|
version: '0'
|
57
57
|
segments:
|
58
58
|
- 0
|
59
|
-
hash: -
|
59
|
+
hash: -3926763858083606606
|
60
60
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
@@ -65,7 +65,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
65
65
|
version: '0'
|
66
66
|
segments:
|
67
67
|
- 0
|
68
|
-
hash: -
|
68
|
+
hash: -3926763858083606606
|
69
69
|
requirements: []
|
70
70
|
rubyforge_project:
|
71
71
|
rubygems_version: 1.8.24
|