Skip to content

Commit f41d7b8

Browse files
committed
Resolved NativeScript#322: Creating an Observable by passing a JSON object in the constructor does not define the respective properties on the Observable object instance.
1 parent 68355e9 commit f41d7b8

2 files changed

Lines changed: 63 additions & 0 deletions

File tree

apps/tests/ui/observable-tests.ts

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,3 +334,47 @@ export var test_Observable_removeEventListener_SingleEvent_NoCallbackSpecified =
334334
obj.set("testName", 2);
335335
TKUnit.assert(receivedCount === 2, "Expected receive count is 2");
336336
}
337+
338+
export var test_Observable_WhenCreatedWithJSON_PropertyChangedWithDotNotation_RaisesPropertyChangedEvent = function () {
339+
var json = {
340+
count: 5
341+
};
342+
var obj = new observable.Observable(json);
343+
344+
var receivedCount = 0;
345+
var callback = function (data: observable.PropertyChangeData) {
346+
receivedCount++;
347+
TKUnit.assert(data.eventName === observable.Observable.propertyChangeEvent, "Expected event name " + observable.Observable.propertyChangeEvent);
348+
TKUnit.assert(data.object === obj, "PropertyChangeData.object value not valid.");
349+
TKUnit.assert(data.propertyName === "count", "PropertyChangeData.propertyName value not valid.");
350+
TKUnit.assert(data.value === 6, "PropertyChangeData.value value not valid.");
351+
}
352+
353+
obj.addEventListener(observable.Observable.propertyChangeEvent, callback);
354+
355+
(<any>obj).count++;
356+
357+
TKUnit.assert(receivedCount === 1, "PropertyChanged event not raised properly.");
358+
}
359+
360+
export var test_Observable_WhenCreatedWithJSON_PropertyChangedWithBracketsNotation_RaisesPropertyChangedEvent = function () {
361+
var json = {
362+
count: 5
363+
};
364+
var obj = new observable.Observable(json);
365+
366+
var receivedCount = 0;
367+
var callback = function (data: observable.PropertyChangeData) {
368+
receivedCount++;
369+
TKUnit.assert(data.eventName === observable.Observable.propertyChangeEvent, "Expected event name " + observable.Observable.propertyChangeEvent);
370+
TKUnit.assert(data.object === obj, "PropertyChangeData.object value not valid.");
371+
TKUnit.assert(data.propertyName === "count", "PropertyChangeData.propertyName value not valid.");
372+
TKUnit.assert(data.value === 6, "PropertyChangeData.value value not valid.");
373+
}
374+
375+
obj.addEventListener(observable.Observable.propertyChangeEvent, callback);
376+
377+
obj["count"]++;
378+
379+
TKUnit.assert(receivedCount === 1, "PropertyChanged event not raised properly.");
380+
}

data/observable/observable.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,32 @@ interface ListenerEntry {
88

99
export class Observable implements definition.Observable {
1010
public static propertyChangeEvent = "propertyChange";
11+
private _map: Map<string, Object>;
1112

1213
private _observers = {};
1314

1415
constructor(json?: any) {
1516
if (json) {
17+
this._map = new Map<string, Object>();
18+
var that = this;
19+
20+
var definePropertyFunc = function definePropertyFunc(propertyName) {
21+
Object.defineProperty(Observable.prototype, propertyName, {
22+
get: function () {
23+
return that._map.get(propertyName);
24+
},
25+
set: function (value) {
26+
that._map.set(propertyName, value);
27+
that.notify(that._createPropertyChangeData(propertyName, value));
28+
},
29+
enumerable: true,
30+
configurable: true
31+
});
32+
};
33+
1634
for (var prop in json) {
1735
if (json.hasOwnProperty(prop)) {
36+
definePropertyFunc(prop);
1837
this.set(prop, json[prop]);
1938
}
2039
}

0 commit comments

Comments
 (0)