diff --git a/apps/tests/ui/observable-tests.ts b/apps/tests/ui/observable-tests.ts index a8b9f8440..23f76f057 100644 --- a/apps/tests/ui/observable-tests.ts +++ b/apps/tests/ui/observable-tests.ts @@ -334,3 +334,47 @@ export var test_Observable_removeEventListener_SingleEvent_NoCallbackSpecified = obj.set("testName", 2); TKUnit.assert(receivedCount === 2, "Expected receive count is 2"); } + +export var test_Observable_WhenCreatedWithJSON_PropertyChangedWithDotNotation_RaisesPropertyChangedEvent = function () { + var json = { + count: 5 + }; + var obj = new observable.Observable(json); + + var receivedCount = 0; + var callback = function (data: observable.PropertyChangeData) { + receivedCount++; + TKUnit.assert(data.eventName === observable.Observable.propertyChangeEvent, "Expected event name " + observable.Observable.propertyChangeEvent); + TKUnit.assert(data.object === obj, "PropertyChangeData.object value not valid."); + TKUnit.assert(data.propertyName === "count", "PropertyChangeData.propertyName value not valid."); + TKUnit.assert(data.value === 6, "PropertyChangeData.value value not valid."); + } + + obj.addEventListener(observable.Observable.propertyChangeEvent, callback); + + (obj).count++; + + TKUnit.assert(receivedCount === 1, "PropertyChanged event not raised properly."); +} + +export var test_Observable_WhenCreatedWithJSON_PropertyChangedWithBracketsNotation_RaisesPropertyChangedEvent = function () { + var json = { + count: 5 + }; + var obj = new observable.Observable(json); + + var receivedCount = 0; + var callback = function (data: observable.PropertyChangeData) { + receivedCount++; + TKUnit.assert(data.eventName === observable.Observable.propertyChangeEvent, "Expected event name " + observable.Observable.propertyChangeEvent); + TKUnit.assert(data.object === obj, "PropertyChangeData.object value not valid."); + TKUnit.assert(data.propertyName === "count", "PropertyChangeData.propertyName value not valid."); + TKUnit.assert(data.value === 6, "PropertyChangeData.value value not valid."); + } + + obj.addEventListener(observable.Observable.propertyChangeEvent, callback); + + obj["count"]++; + + TKUnit.assert(receivedCount === 1, "PropertyChanged event not raised properly."); +} diff --git a/data/observable/observable.ts b/data/observable/observable.ts index f63cb76e6..0051686de 100644 --- a/data/observable/observable.ts +++ b/data/observable/observable.ts @@ -8,13 +8,32 @@ interface ListenerEntry { export class Observable implements definition.Observable { public static propertyChangeEvent = "propertyChange"; + private _map: Map; private _observers = {}; constructor(json?: any) { if (json) { + this._map = new Map(); + var that = this; + + var definePropertyFunc = function definePropertyFunc(propertyName) { + Object.defineProperty(Observable.prototype, propertyName, { + get: function () { + return that._map.get(propertyName); + }, + set: function (value) { + that._map.set(propertyName, value); + that.notify(that._createPropertyChangeData(propertyName, value)); + }, + enumerable: true, + configurable: true + }); + }; + for (var prop in json) { if (json.hasOwnProperty(prop)) { + definePropertyFunc(prop); this.set(prop, json[prop]); } }