Skip to content

Commit 84b8071

Browse files
committed
Keep backwards compatibility with v1
1 parent 9a15fcf commit 84b8071

File tree

2 files changed

+24
-20
lines changed

2 files changed

+24
-20
lines changed

backbone.js

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,6 @@
4242

4343
// Create a local reference to a common array method we'll want to use later.
4444
var slice = Array.prototype.slice;
45-
var splice = function(array, insert, at) {
46-
var length = insert.length;
47-
var result = Array(array.length + length);
48-
for (var i = 0; i < at; i++) result[i] = array[i];
49-
for (i = 0; i < length; i++) result[i + at] = insert[i];
50-
for (i = at; i < array.length; i++) result[i + length] = array[i];
51-
return result;
52-
};
5345

5446
// Current version of the library. Keep in sync with `package.json`.
5547
Backbone.VERSION = '1.2.0';
@@ -754,6 +746,15 @@
754746
var setOptions = {add: true, remove: true, merge: true};
755747
var addOptions = {add: true, remove: false};
756748

749+
// Splices `insert` into `array` at index `at`.
750+
var splice = function(array, insert, at) {
751+
var tail = Array(result.length - at);
752+
var length = insert.length;
753+
for (var i = 0; i < tail.length; i++) tail[i] = result[i + at];
754+
for (i = 0; i < length; i++) result[i + at] = insert[i];
755+
for (i = 0; i < tail.length; i++) result[i + length + at] = tail[i];
756+
};
757+
757758
// Define the Collection's inheritable methods.
758759
_.extend(Collection.prototype, Events, {
759760

@@ -802,7 +803,7 @@
802803
if (options.parse && !this._isModel(models)) models = this.parse(models, options);
803804

804805
var singular = !_.isArray(models);
805-
models = singular ? [models] : models;
806+
models = singular ? [models] : _.clone(models);
806807

807808
var at = options.at;
808809
if (at != null) at = +at;
@@ -841,10 +842,11 @@
841842
modelMap[existing.cid] = true;
842843
set.push(existing);
843844
}
845+
models[i] = existing;
844846

845847
// If this is a new, valid model, push it to the `toAdd` list.
846848
} else if (add) {
847-
model = this._prepareModel(model, options);
849+
model = models[i] = this._prepareModel(model, options);
848850
if (model) {
849851
toAdd.push(model);
850852
this._addReference(model, options);
@@ -865,16 +867,18 @@
865867

866868
// See if sorting is needed, update `length` and splice in new models.
867869
var orderChanged = false;
868-
if (set.length && !sortable && add && remove) {
869-
orderChanged = set.length != this.length || _.any(this.models, function(model, index) {
870+
var replace = !sortable && add && remove;
871+
if (set.length && replace) {
872+
orderChanged = this.length != set.length || _.any(this.models, function(model, index) {
870873
return model !== set[index];
871874
});
872-
this.models = set.slice();
873-
this.length = set.length;
875+
this.models.length = 0;
876+
splice(this.models, set, 0);
877+
this.length = this.models.length;
874878
} else if (toAdd.length) {
875879
if (sortable) sort = true;
876-
this.models = splice(this.models, toAdd, at == null ? this.length : at);
877-
this.length += toAdd.length;
880+
splice(this.models, toAdd, at == null ? this.length : at);
881+
this.length = this.models.length;
878882
}
879883

880884
// Silently sort the collection if appropriate.
@@ -892,7 +896,7 @@
892896
}
893897

894898
// Return the added (or merged) model (or models).
895-
return singular ? set[0] : set;
899+
return singular ? models[0] : models;
896900
},
897901

898902
// When you have more items than you want to add or remove individually,

test/collection.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -339,11 +339,11 @@
339339

340340
list = col.add([{id: 3}, {id: 6}], {validate: true});
341341
equal(col.length, 3);
342-
equal(list.length, 1);
343-
equal(list[0].get('id'), 6);
342+
equal(list[0], false);
343+
equal(list[1].get('id'), 6);
344344

345345
var result = col.add({id: 6});
346-
equal(result.cid, list[0].cid);
346+
equal(result.cid, list[1].cid);
347347

348348
result = col.remove({id: 6});
349349
equal(col.length, 2);

0 commit comments

Comments
 (0)