mirror of
https://github.com/NativeScript/NativeScript.git
synced 2025-08-16 03:31:45 +08:00
Resolved #322: Creating an Observable by passing a JSON object in the constructor does not define the respective properties on the Observable object instance.
This commit is contained in:
@ -334,3 +334,47 @@ export var test_Observable_removeEventListener_SingleEvent_NoCallbackSpecified =
|
|||||||
obj.set("testName", 2);
|
obj.set("testName", 2);
|
||||||
TKUnit.assert(receivedCount === 2, "Expected receive count is 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);
|
||||||
|
|
||||||
|
(<any>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.");
|
||||||
|
}
|
||||||
|
@ -8,13 +8,32 @@ interface ListenerEntry {
|
|||||||
|
|
||||||
export class Observable implements definition.Observable {
|
export class Observable implements definition.Observable {
|
||||||
public static propertyChangeEvent = "propertyChange";
|
public static propertyChangeEvent = "propertyChange";
|
||||||
|
private _map: Map<string, Object>;
|
||||||
|
|
||||||
private _observers = {};
|
private _observers = {};
|
||||||
|
|
||||||
constructor(json?: any) {
|
constructor(json?: any) {
|
||||||
if (json) {
|
if (json) {
|
||||||
|
this._map = new Map<string, Object>();
|
||||||
|
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) {
|
for (var prop in json) {
|
||||||
if (json.hasOwnProperty(prop)) {
|
if (json.hasOwnProperty(prop)) {
|
||||||
|
definePropertyFunc(prop);
|
||||||
this.set(prop, json[prop]);
|
this.set(prop, json[prop]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user