From bfe4301abd802fbabb8b7aa3238ed23a583261f6 Mon Sep 17 00:00:00 2001 From: Saroj Yadav Date: Tue, 27 Mar 2012 12:04:22 -0700 Subject: [PATCH] For a resource, update its underlying data only if the API data is different than its current data. --- spec/javascripts/deepMergeSpec.js | 23 +++++++++++++++++++++++ src/ember-resource.js | 9 ++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/spec/javascripts/deepMergeSpec.js b/spec/javascripts/deepMergeSpec.js index 00ecb33..c4eb94a 100644 --- a/spec/javascripts/deepMergeSpec.js +++ b/spec/javascripts/deepMergeSpec.js @@ -15,6 +15,29 @@ describe('deepMerge', function() { expect(obj.a).toBe('bar'); }); + it('should not override keys if values are same', function() { + var obj = {a: 'foo'}; + spyOn(Ember, 'set'); + Ember.Resource.deepMerge(obj, {a: 'foo'}); + expect(Ember.set).not.toHaveBeenCalledWith(obj, 'a', 'foo'); + }); + + it('should not override keys if values are empty arrays', function() { + var obj = {a: []}; + spyOn(Ember, 'set'); + Ember.Resource.deepMerge(obj, {a: []}); + expect(Ember.set).not.toHaveBeenCalledWith(obj, 'a', []); + }); + + it('should override keys if values are not empty arrays', function() { + var obj = {a: [2]}; + Ember.Resource.deepMerge(obj, {a: [3]}); + expect(obj.a).toBeDefined(); + expect(obj.a.length).toBe(1); + expect(obj.a[0]).toBe(3); + }); + + it('should leave other keys', function() { var obj = {a: 'foo'}; Ember.Resource.deepMerge(obj, {b: 'bar'}); diff --git a/src/ember-resource.js b/src/ember-resource.js index 38b8878..30edc57 100644 --- a/src/ember-resource.js +++ b/src/ember-resource.js @@ -52,8 +52,15 @@ if (Ember.typeOf(newValue) === 'object' && Ember.typeOf(oldValue) === 'object') { Ember.Resource.deepMerge(oldValue, newValue); + } else { - Ember.set(objA, key, newValue); + oldValueEmptyArray = (Ember.typeOf(oldValue) == "array") && (oldValue.length == 0) + newValueEmptyArray = (Ember.typeOf(newValue) == "array") && (newValue.length == 0) + + if((newValue != oldValue) && (!oldValueEmptyArray && !newValueEmptyArray) ){ + Ember.set(objA, key, newValue); + } + } } }