diff --git a/packages/ember-data/lib/system/model/model.js b/packages/ember-data/lib/system/model/model.js index d8415551623..5c71d46e81d 100644 --- a/packages/ember-data/lib/system/model/model.js +++ b/packages/ember-data/lib/system/model/model.js @@ -321,6 +321,12 @@ DS.Model = Ember.Object.extend(Ember.Evented, { setupData: function(data) { this._data = data; + var relationships = this._relationships; + + this.eachRelationship(function(name, rel) { + if (rel.options.async) { relationships[name] = null; } + }); + if (data) { this.pushedData(); } this.suspendRelationshipObservers(function() { diff --git a/packages/ember-data/lib/system/store.js b/packages/ember-data/lib/system/store.js index f153c45e955..1ba1a03ee61 100644 --- a/packages/ember-data/lib/system/store.js +++ b/packages/ember-data/lib/system/store.js @@ -538,6 +538,7 @@ DS.Store = Ember.Object.extend(DS._Mappable, { this.fetchMany(unloadedRecords, owner, resolver); } else { + if (resolver) { resolver.resolve(); } manyArray.set('isLoaded', true); Ember.run.once(manyArray, 'trigger', 'didLoad'); } diff --git a/packages/ember-data/tests/integration/records/reload_test.js b/packages/ember-data/tests/integration/records/reload_test.js index 8e6b9c5a333..e00b4ce0780 100644 --- a/packages/ember-data/tests/integration/records/reload_test.js +++ b/packages/ember-data/tests/integration/records/reload_test.js @@ -89,3 +89,44 @@ test("When a record is loaded a second time, isLoaded stays true", function() { equal(get(this, 'isLoaded'), true, "The person is still loaded after change"); } }); + +test("When a record is reloaded, its async hasMany relationships still work", function() { + env.container.register('model:person', DS.Model.extend({ + name: DS.attr(), + tags: DS.hasMany('tag', { async: true }) + })); + + env.container.register('model:tag', DS.Model.extend({ + name: DS.attr() + })); + + var tags = { 1: "hipster", 2: "hair" }; + + env.adapter.find = function(store, type, id) { + switch (type.typeKey) { + case 'person': + return Ember.RSVP.resolve({ id: 1, name: "Tom", tags: [1, 2] }); + case 'tag': + return Ember.RSVP.resolve({ id: id, name: tags[id] }); + } + }; + + var tom; + + env.store.find('person', 1).then(async(function(person) { + tom = person; + equal(person.get('name'), "Tom", "precond"); + + return person.get('tags'); + })).then(async(function(tags) { + deepEqual(tags.mapBy('name'), [ 'hipster', 'hair' ]); + + return tom.reload(); + })).then(async(function(person) { + equal(person.get('name'), "Tom", "precond"); + + return person.get('tags'); + })).then(async(function(tags) { + deepEqual(tags.mapBy('name'), [ 'hipster', 'hair' ], "The tags are still there"); + })); +});