Fixed Issue #929.

This commit is contained in:
Rossen Hristov
2015-10-13 15:13:38 +03:00
parent e64fa80b56
commit d868642208
2 changed files with 58 additions and 18 deletions

View File

@@ -379,7 +379,7 @@ export var test_Observable_WhenCreatedWithJSON_PropertyChangedWithBracketsNotati
TKUnit.assert(receivedCount === 1, "PropertyChanged event not raised properly."); TKUnit.assert(receivedCount === 1, "PropertyChanged event not raised properly.");
} }
export function test_AddingTwoEventHandlersAndRemovingWithinHandlerShouldRaiseAllEvents() { export var test_AddingTwoEventHandlersAndRemovingWithinHandlerShouldRaiseAllEvents = function() {
var observableInstance = new observable.Observable(); var observableInstance = new observable.Observable();
var firstHandlerCalled = false; var firstHandlerCalled = false;
var secondHandlerCalled= false; var secondHandlerCalled= false;
@@ -406,7 +406,7 @@ export function test_AddingTwoEventHandlersAndRemovingWithinHandlerShouldRaiseAl
TKUnit.assertEqual(secondHandlerCalled, true); TKUnit.assertEqual(secondHandlerCalled, true);
} }
export function test_Observable_shouldDistinguishSeparateObjects() { export var test_ObservableCreatedWithJSON_shouldDistinguishSeparateObjects = function () {
var obj1 = {val: 1}; var obj1 = {val: 1};
var obj2 = {val: 2}; var obj2 = {val: 2};
var observable1 = new observable.Observable(obj1); var observable1 = new observable.Observable(obj1);
@@ -416,25 +416,66 @@ export function test_Observable_shouldDistinguishSeparateObjects() {
var val2 = observable2.get("val"); var val2 = observable2.get("val");
TKUnit.assert(val1 === 1 && val2 === 2, `Observable should keep separate objects separate! val1: ${val1}; val2: ${val2};`); TKUnit.assert(val1 === 1 && val2 === 2, `Observable should keep separate objects separate! val1: ${val1}; val2: ${val2};`);
var propName1;
var newValue1; var newValue1;
observable1.on(observable.Observable.propertyChangeEvent, (data: observable.PropertyChangeData) => { observable1.on(observable.Observable.propertyChangeEvent, (data: observable.PropertyChangeData) => {
propName1 = data.propertyName;
newValue1 = data.value; newValue1 = data.value;
}); });
var propName2;
var newValue2; var newValue2;
observable2.on(observable.Observable.propertyChangeEvent, (data: observable.PropertyChangeData) => { observable2.on(observable.Observable.propertyChangeEvent, (data: observable.PropertyChangeData) => {
propName2 = data.propertyName;
newValue2 = data.value; newValue2 = data.value;
}); });
observable1.set("val", 10); observable1.set("val", 10);
TKUnit.wait(0.1); TKUnit.wait(0.1);
TKUnit.assert(propName1 === "val", "propName1 should be 'val'");
TKUnit.assert(newValue1 === 10, "newValue1 should be 10"); TKUnit.assert(newValue1 === 10, "newValue1 should be 10");
observable2.set("val", 20); observable2.set("val", 20);
TKUnit.wait(0.1); TKUnit.wait(0.1);
TKUnit.assert(propName2 === "val", "propName2 should be 'val'");
TKUnit.assert(newValue2 === 20, "newValue2 should be 20"); TKUnit.assert(newValue2 === 20, "newValue2 should be 20");
val1 = observable1.get("val"); val1 = observable1.get("val");
val2 = observable2.get("val"); val2 = observable2.get("val");
TKUnit.assert(val1 === 10 && val2 === 20, `Observable should keep separate objects separate! val1: ${val1}; val2: ${val2};`); TKUnit.assert(val1 === 10 && val2 === 20, `Observable should keep separate objects separate! val1: ${val1}; val2: ${val2};`);
}; };
export var test_ObservablesCreatedWithJSON_shouldNotInterfereWithOneAnother = function () {
var observable1 = new observable.Observable({ property1: 1 });
var observable2 = new observable.Observable({ property2: 2 });
TKUnit.assert(observable1.get("property1") === 1, `Expected: 1; Actual: ${observable1.get("property1")}`);
TKUnit.assert(observable1.get("property2") === undefined, `Expected: undefined; Actual: ${observable1.get("property2") }`);
TKUnit.assert(observable2.get("property1") === undefined, `Expected: undefined; Actual: ${observable2.get("property1") }`);
TKUnit.assert(observable2.get("property2") === 2, `Expected: 2; Actual: ${observable2.get("property2") }`);
var propName1;
var newValue1;
observable1.on(observable.Observable.propertyChangeEvent, (data: observable.PropertyChangeData) => {
propName1 = data.propertyName;
newValue1 = data.value;
});
var propName2;
var newValue2;
observable2.on(observable.Observable.propertyChangeEvent, (data: observable.PropertyChangeData) => {
propName2 = data.propertyName;
newValue2 = data.value;
});
observable1.set("property1", 10);
TKUnit.wait(0.1);
TKUnit.assert(propName1 === "property1", "propName1 should be 'property1'");
TKUnit.assert(newValue1 === 10, "newValue1 should be 10");
observable2.set("property2", 20);
TKUnit.wait(0.1);
TKUnit.assert(propName2 === "property2", "propName2 should be 'property2'");
TKUnit.assert(newValue2 === 20, "newValue2 should be 20");
};

View File

@@ -15,9 +15,17 @@ export class Observable implements definition.Observable {
constructor(json?: any) { constructor(json?: any) {
if (json) { if (json) {
this._map = new Map<string, Object>(); this._map = new Map<string, Object>();
for (var prop in json) {
if (json.hasOwnProperty(prop)) {
this._defineNewProperty(prop);
this.set(prop, json[prop]);
}
}
}
}
var definePropertyFunc = function definePropertyFunc(propertyName) { private _defineNewProperty(propertyName: string): void {
Object.defineProperty(Observable.prototype, propertyName, { Object.defineProperty(this, propertyName, {
get: function () { get: function () {
return this._map.get(propertyName); return this._map.get(propertyName);
}, },
@@ -28,15 +36,6 @@ export class Observable implements definition.Observable {
enumerable: true, enumerable: true,
configurable: true configurable: true
}); });
};
for (var prop in json) {
if (json.hasOwnProperty(prop)) {
definePropertyFunc(prop);
this.set(prop, json[prop]);
}
}
}
} }
get typeName(): string { get typeName(): string {