From 93123c77cd84b9558e11e38ca50cd255c1333fe7 Mon Sep 17 00:00:00 2001 From: pangratz Date: Sat, 9 Apr 2016 16:42:00 +0200 Subject: [PATCH 1/2] [FEATURE ds-links-in-record-array] DRY up logic for setting properties --- .../adapter-populated-record-array.js | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/addon/-private/system/record-arrays/adapter-populated-record-array.js b/addon/-private/system/record-arrays/adapter-populated-record-array.js index a1997699a8b..80bb7f0e7ca 100644 --- a/addon/-private/system/record-arrays/adapter-populated-record-array.js +++ b/addon/-private/system/record-arrays/adapter-populated-record-array.js @@ -36,19 +36,14 @@ export default RecordArray.extend({ loadRecords(records, payload) { //TODO Optimize var internalModels = Ember.A(records).mapBy('_internalModel'); + this.setProperties({ + content: Ember.A(internalModels), + isLoaded: true, + meta: cloneNull(payload.meta) + }); + if (isEnabled('ds-links-in-record-array')) { - this.setProperties({ - content: Ember.A(internalModels), - isLoaded: true, - meta: cloneNull(payload.meta), - links: cloneNull(payload.links) - }); - } else { - this.setProperties({ - content: Ember.A(internalModels), - isLoaded: true, - meta: cloneNull(payload.meta) - }); + this.set('links', cloneNull(payload.links)); } internalModels.forEach((record) => { From 89ce6cde4070b68606cef4fc66364b6b5462e9cd Mon Sep 17 00:00:00 2001 From: pangratz Date: Sat, 9 Apr 2016 16:59:45 +0200 Subject: [PATCH 2/2] [BUGFIX beta] fix isUpdating for AdapterPopulatedRecordArray#update() The `isUpdating` flag is not set to `true` when the `update()` method on a `DS.AdapterPopulatedRecordArray` is invoked. As with the flag on `DS.RecordArray`, this should be `true` until the update is finished and the array contains the most reset result for the query, fetched from the adapter. --- .../adapter-populated-record-array.js | 9 ++++++ .../system/record-arrays/record-array.js | 20 ++++++++---- addon/-private/system/store.js | 2 -- tests/integration/adapter/queries-test.js | 31 +++++++++++++++++++ 4 files changed, 54 insertions(+), 8 deletions(-) diff --git a/addon/-private/system/record-arrays/adapter-populated-record-array.js b/addon/-private/system/record-arrays/adapter-populated-record-array.js index 80bb7f0e7ca..b86a5380910 100644 --- a/addon/-private/system/record-arrays/adapter-populated-record-array.js +++ b/addon/-private/system/record-arrays/adapter-populated-record-array.js @@ -27,6 +27,14 @@ export default RecordArray.extend({ throw new Error("The result of a server query (on " + type + ") is immutable."); }, + _update() { + let store = get(this, 'store'); + let modelName = get(this, 'type.modelName'); + let query = get(this, 'query'); + + return store._query(modelName, query, this); + }, + /** @method loadRecords @param {Array} records @@ -39,6 +47,7 @@ export default RecordArray.extend({ this.setProperties({ content: Ember.A(internalModels), isLoaded: true, + isUpdating: false, meta: cloneNull(payload.meta) }); diff --git a/addon/-private/system/record-arrays/record-array.js b/addon/-private/system/record-arrays/record-array.js index ae1252ccd49..b3f020d44b6 100644 --- a/addon/-private/system/record-arrays/record-array.js +++ b/addon/-private/system/record-arrays/record-array.js @@ -106,7 +106,11 @@ export default Ember.ArrayProxy.extend(Ember.Evented, { ```javascript var people = store.peekAll('person'); people.get('isUpdating'); // false - people.update(); + + people.update().then(function() { + people.get('isUpdating'); // false + }); + people.get('isUpdating'); // true ``` @@ -115,13 +119,17 @@ export default Ember.ArrayProxy.extend(Ember.Evented, { update() { if (get(this, 'isUpdating')) { return; } + this.set('isUpdating', true); + return this._update(); + }, + + /* + Update this RecordArray and return a promise which resolves once the update + is finished. + */ + _update() { let store = get(this, 'store'); let modelName = get(this, 'type.modelName'); - let query = get(this, 'query'); - - if (query) { - return store._query(modelName, query, this); - } return store.findAll(modelName, { reload: true }); }, diff --git a/addon/-private/system/store.js b/addon/-private/system/store.js index 638776894e5..6b1c068c69d 100644 --- a/addon/-private/system/store.js +++ b/addon/-private/system/store.js @@ -1006,8 +1006,6 @@ Store = Service.extend({ var adapter = this.adapterFor(typeClass.modelName); var sinceToken = this.typeMapFor(typeClass).metadata.since; - set(array, 'isUpdating', true); - assert("You tried to load all records but you have no adapter (for " + typeClass + ")", adapter); assert("You tried to load all records but your adapter does not implement `findAll`", typeof adapter.findAll === 'function'); if (options.reload) { diff --git a/tests/integration/adapter/queries-test.js b/tests/integration/adapter/queries-test.js index 966fe20009a..fcc354a5196 100644 --- a/tests/integration/adapter/queries-test.js +++ b/tests/integration/adapter/queries-test.js @@ -57,6 +57,37 @@ test("When a query is made, the adapter should receive a record array it can pop })); }); +test("a query can be updated via `update()`", function(assert) { + adapter.query = function() { + return Ember.RSVP.resolve([{ id: 'first' }]); + }; + + run(function() { + store.query('person', {}).then(function(query) { + assert.equal(query.get('length'), 1); + assert.equal(query.get('firstObject.id'), 'first'); + assert.equal(query.get('isUpdating'), false); + + adapter.query = function() { + assert.ok('query is called a second time'); + return Ember.RSVP.resolve([{ id: 'second' }]); + }; + + let updateQuery = query.update(); + + assert.equal(query.get('isUpdating'), true); + + return updateQuery; + + }).then(function(query) { + assert.equal(query.get('length'), 1); + assert.equal(query.get('firstObject.id'), 'second'); + + assert.equal(query.get('isUpdating'), false); + }); + }); +}); + testInDebug("The store asserts when query is made and the adapter responses with a single record.", function(assert) { env = setupStore({ person: Person, adapter: DS.RESTAdapter }); store = env.store;