diff --git a/addon/-private/system/model/internal-model.js b/addon/-private/system/model/internal-model.js index e1043f11d8c..cbeee02c29d 100644 --- a/addon/-private/system/model/internal-model.js +++ b/addon/-private/system/model/internal-model.js @@ -497,6 +497,7 @@ export default class InternalModel { if (this.isDestroyed) { return; } this.send('unloadRecord'); this.dematerializeRecord(); + this.store.recordArrayManager.recordWasUnloaded(this); if (this._scheduledDestroy === null) { // TODO: use run.schedule once we drop 1.13 diff --git a/addon/-private/system/record-array-manager.js b/addon/-private/system/record-array-manager.js index 9802e02ce79..89e0901ff4b 100644 --- a/addon/-private/system/record-array-manager.js +++ b/addon/-private/system/record-array-manager.js @@ -76,6 +76,13 @@ export default class RecordArrayManager { this.internalModelDidChange(internalModel); } + recordWasUnloaded(internalModel) { + let array = this._liveRecordArrays[internalModel.modelName]; + if (array) { + array._removeInternalModels([internalModel]); + } + } + internalModelDidChange(internalModel) { heimdall.increment(recordDidChange); diff --git a/tests/integration/debug-adapter-test.js b/tests/integration/debug-adapter-test.js index 5833c5506c8..4510c6d6006 100644 --- a/tests/integration/debug-adapter-test.js +++ b/tests/integration/debug-adapter-test.js @@ -70,7 +70,7 @@ test('Watching Model Types', function(assert) { assert.equal(types[0].count, 1); } - debugAdapter.watchModelTypes(added, updated); + const release = debugAdapter.watchModelTypes(added, updated); run(() => { store.push({ @@ -83,6 +83,8 @@ test('Watching Model Types', function(assert) { } }); }); + + release(); }); test("Watching Records", function(assert) { diff --git a/tests/integration/records/unload-test.js b/tests/integration/records/unload-test.js index f7cdb8494a4..3e173cf8aa7 100644 --- a/tests/integration/records/unload-test.js +++ b/tests/integration/records/unload-test.js @@ -2117,3 +2117,43 @@ test('fetching records cancels unloading', function(assert) { .then(person => person.unloadRecord()) ); }); + +test("unload live records", function(assert) { + env.adapter.findAll = () => { + return { + data: [{ + type: 'person', + id: '1', + attributes: { + name: 'Adam Sunderland' + } + }, { + type: 'person', + id: '2', + attributes: { + name: 'Bob Bobson' + } + }] + } + }; + + return env.store.findAll('person').then(records => { + assert.equal(records.get('length'), 2, 'two records returned from findAll'); + + const peeked = env.store.peekAll('person'); + assert.equal(peeked.get('length'), 2, 'two records returned from peekAll'); + + run(function() { + env.store.unloadAll('person'); + }); + + assert.equal(records.get('length'), 0, 'findAll array was cleared'); + assert.equal(peeked.get('length'), 0, 'peekAll array was cleared'); + + return env.store.findAll('person').then(recordsAgain => { + assert.equal(recordsAgain.get('length'), 2, 'two records returned from new findAll'); + assert.equal(records.get('length'), 2, 'old findAll array has two records'); + assert.equal(peeked.get('length'), 2, 'old peekAll array has two records'); + }); + }); +});