Skip to content

Commit 9370a08

Browse files
committed
Clear old data on fetch
1 parent 222efeb commit 9370a08

File tree

3 files changed

+60
-3
lines changed

3 files changed

+60
-3
lines changed

src/ParseObject.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1305,10 +1305,12 @@ export default class ParseObject {
13051305
* Creates a new instance of a Parse Object from a JSON representation.
13061306
* @method fromJSON
13071307
* @param {Object} json The JSON map of the Object's data
1308+
* @param {boolean} override In single instance mode, all old server data
1309+
* is overwritten if this is set to true
13081310
* @static
13091311
* @return {Parse.Object} A Parse.Object reference
13101312
*/
1311-
static fromJSON(json) {
1313+
static fromJSON(json, override) {
13121314
if (!json.className) {
13131315
throw new Error('Cannot create an object without a className');
13141316
}
@@ -1320,6 +1322,13 @@ export default class ParseObject {
13201322
otherAttributes[attr] = json[attr];
13211323
}
13221324
}
1325+
if (override) {
1326+
// id needs to be set before clearServerData can work
1327+
if (otherAttributes.objectId) {
1328+
o.id = otherAttributes.objectId;
1329+
}
1330+
o._clearServerData();
1331+
}
13231332
o._finishFetch(otherAttributes);
13241333
if (json.objectId) {
13251334
o._setExisted(true);
@@ -1587,6 +1596,7 @@ var DefaultController = {
15871596
).then((response, status, xhr) => {
15881597
if (target instanceof ParseObject) {
15891598
target._clearPendingOps();
1599+
target._clearServerData();
15901600
target._finishFetch(response);
15911601
}
15921602
return target;

src/ParseQuery.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ export default class ParseQuery {
283283
if (!data.className) {
284284
data.className = override;
285285
}
286-
return ParseObject.fromJSON(data);
286+
return ParseObject.fromJSON(data, true);
287287
});
288288
})._thenRunCallbacks(options);
289289
}
@@ -381,7 +381,7 @@ export default class ParseQuery {
381381
if (!objects[0].className) {
382382
objects[0].className = this.className;
383383
}
384-
return ParseObject.fromJSON(objects[0]);
384+
return ParseObject.fromJSON(objects[0], true);
385385
})._thenRunCallbacks(options);
386386
}
387387

src/__tests__/ParseObject-test.js

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,27 @@ describe('ParseObject', () => {
152152
expect(o.dirty()).toBe(false);
153153
});
154154

155+
it('can override old data when inflating from the server', () => {
156+
var o = ParseObject.fromJSON({
157+
className: 'Item',
158+
objectId: 'I01',
159+
size: 'small'
160+
});
161+
expect(o.get('size')).toBe('small');
162+
var o2 = ParseObject.fromJSON({
163+
className: 'Item',
164+
objectId: 'I01',
165+
disabled: true
166+
}, true);
167+
expect(o.get('disabled')).toBe(true);
168+
expect(o.get('size')).toBe(undefined);
169+
expect(o.has('size')).toBe(false);
170+
171+
expect(o2.get('disabled')).toBe(true);
172+
expect(o2.get('size')).toBe(undefined);
173+
expect(o2.has('size')).toBe(false);
174+
});
175+
155176
it('is given a local Id once dirtied', () => {
156177
var o = new ParseObject('Item');
157178
o.set('size', 'small');
@@ -1214,6 +1235,32 @@ describe('ParseObject', () => {
12141235
});
12151236
}));
12161237

1238+
it('replaces old data when fetch() is called', asyncHelper((done) => {
1239+
CoreManager.getRESTController()._setXHR(
1240+
mockXHR([{
1241+
status: 200,
1242+
response: {
1243+
count: 10
1244+
}
1245+
}])
1246+
);
1247+
1248+
var p = ParseObject.fromJSON({
1249+
className: 'Person',
1250+
objectId: 'P200',
1251+
name: 'Fred',
1252+
count: 0
1253+
});
1254+
expect(p.get('name')).toBe('Fred');
1255+
expect(p.get('count')).toBe(0);
1256+
p.fetch().then(() => {
1257+
expect(p.get('count')).toBe(10);
1258+
expect(p.get('name')).toBe(undefined);
1259+
expect(p.has('name')).toBe(false);
1260+
done();
1261+
});
1262+
}));
1263+
12171264
it('can destroy an object', asyncHelper((done) => {
12181265
var xhr = {
12191266
setRequestHeader: jest.genMockFn(),

0 commit comments

Comments
 (0)