From 8cfb243b8e46837c72f64811882d55c5e02cd569 Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Wed, 11 Jan 2012 17:03:30 -0500 Subject: [PATCH] Fixes #836, Fixes #708 -- going back to previous stance: two models with the same id can't be added to the same collection. --- backbone.js | 6 ++++-- test/collection.js | 13 ++++++++++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/backbone.js b/backbone.js index 5c7dae6ae..485ec30ae 100644 --- a/backbone.js +++ b/backbone.js @@ -422,10 +422,12 @@ models = slice.call(models); for (i = 0, l = models.length; i < l; i++) { var model = models[i] = this._prepareModel(models[i], options); - if (this._byCid[model.cid]) { + var hasId = model.id != null; + if (this._byCid[model.cid] || (hasId && this._byId[model.id])) { throw new Error("Can't add the same model to a set twice"); } - this._byId[model.id] = this._byCid[model.cid] = model; + this._byCid[model.cid] = model; + if (hasId) this._byId[model.id] = model; model.bind('all', this._onModelEvent, this); this.length++; } diff --git a/test/collection.js b/test/collection.js index 42750031f..eecddb8e8 100644 --- a/test/collection.js +++ b/test/collection.js @@ -136,7 +136,7 @@ $(document).ready(function() { } }); - test("Collection: add model to collection twice", function() { + test("Collection: can't add model to collection twice", function() { try { // no id, same cid var a2 = new Backbone.Model({label: a.label}); @@ -148,6 +148,17 @@ $(document).ready(function() { } }); + test("Collection: can't add different model with same id to collection twice", function() { + var col = new Backbone.Collection; + try { + col.add({id: 101}); + col.add({id: 101}); + ok(false, "duplicate; expected add to fail"); + } catch (e) { + equals(e.message, "Can't add the same model to a set twice"); + } + }); + test("Collection: add model to multiple collections", function() { var counter = 0; var e = new Backbone.Model({id: 10, label : 'e'});