Skip to content

Commit 8f55741

Browse files
committed
Merge pull request #206 from ParsePlatform/clear_on_fetch
Clear old data on fetch
2 parents 06f409d + 9370a08 commit 8f55741

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
@@ -1318,10 +1318,12 @@ export default class ParseObject {
13181318
* Creates a new instance of a Parse Object from a JSON representation.
13191319
* @method fromJSON
13201320
* @param {Object} json The JSON map of the Object's data
1321+
* @param {boolean} override In single instance mode, all old server data
1322+
* is overwritten if this is set to true
13211323
* @static
13221324
* @return {Parse.Object} A Parse.Object reference
13231325
*/
1324-
static fromJSON(json) {
1326+
static fromJSON(json, override) {
13251327
if (!json.className) {
13261328
throw new Error('Cannot create an object without a className');
13271329
}
@@ -1333,6 +1335,13 @@ export default class ParseObject {
13331335
otherAttributes[attr] = json[attr];
13341336
}
13351337
}
1338+
if (override) {
1339+
// id needs to be set before clearServerData can work
1340+
if (otherAttributes.objectId) {
1341+
o.id = otherAttributes.objectId;
1342+
}
1343+
o._clearServerData();
1344+
}
13361345
o._finishFetch(otherAttributes);
13371346
if (json.objectId) {
13381347
o._setExisted(true);
@@ -1600,6 +1609,7 @@ var DefaultController = {
16001609
).then((response, status, xhr) => {
16011610
if (target instanceof ParseObject) {
16021611
target._clearPendingOps();
1612+
target._clearServerData();
16031613
target._finishFetch(response);
16041614
}
16051615
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)